2016-10-18 5 views
0

У меня есть текстовый файл вида:Замена первое появление, кроме комментариев с использованием СЭД

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

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

Для файлов с точно одной строкой с совпадением, я использовал

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

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

ответ

0

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

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

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

a = 1

#b = [2,3]

c = 4

d = 9

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

+0

значение "е" не обрабатывается из образец, который а. –

+0

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

+0

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

0

Это один вкладыш должен делать эту работу:

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

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

Смежные вопросы