Замена первого появления, кроме комментариев, с использованием sed

#sed #command-line #text-processing

#sed #командная строка #обработка текста

Вопрос:

У меня есть текстовый файл вида:

 a = 1
#b = [2,3]
c = 4
d = [5,6]
e = [7,8]
  

Я хочу заменить шаблон внутри скобок (и скобок) на число, но игнорировать совпадения в комментариях, предпочтительно с использованием sed .

Для файлов с ровно одной совпадающей строкой я использовал

 sed -i "/^#/!s/[.*]/9/" myfile
  

Как это можно изменить, чтобы заменить только первое совпадение, если их больше?

Ответ №1:

Это правильно, потому что изменяется только первое вхождение.

awk '!end amp;amp; /^[^#] = [/ {$3="9"; end=1}1' myfile

  • если нет конечного флага и строка не начинается с # и не соответствует = [ , затем измените третий столбец и установите флаг, чтобы предотвратить изменение в следующих вхождениях.

a = 1

#b = [2,3]

c = 4

d = 9

e = [7,8] <— это не изменено так, как вы хотите

Комментарии:

1. значение «e» не обрабатывается из выборочных данных.

2. и это не должно, не так ли? Как говорит автор, как это можно изменить, чтобы заменить только первое совпадение, если их больше? ??

3. Спасибо! Это выполняется в точности в соответствии с тем, что я задал в вопросе. Однако это не сработает, если слева от ‘=’ находится более одного символа. Есть идеи для этого?

4. конечно, я это сделал — добавил в регулярное [^#] выражение, оно должно работать, проверьте это, пожалуйста.

Ответ №2:

Эта однострочная строка должна выполнить эту работу:

 sed  '/^s*#/!{s/[[^]]*]/9/}' file
  

добавьте -i опцию, если хотите внести изменения на месте.