Замена слова на sed, за исключением случаев, когда ему предшествуют комментарии

Основываясь на некоторых произвольных файлах в Интернете(1 и 2 ), я придумал оператор sed, который заменяет пробелы после текста, который выглядит как команда (буквы и символы подчеркивания )с одной вкладкой:

sed 's/^\([a-z_][a-z_]*\)  */\1\t/' input > output

Экранированная скобка захватывает команду (одну или несколько букв и знаков подчеркивания, начиная с начала строки (^)), затем требует одного или нескольких пробелов после этой команды; эти шаблоны заменяются соответствующей командой(\1)и вкладкой. Это соответствие шаблону пропускает закомментированные строки (, потому что #не является буквой или подчеркиванием ).

0
10.03.2021, 00:52
1 ответ

Поскольку вы отметили свой вопрос sed, вот один из подходов, использующих его:

  • если строка содержит комментарий, копировать, чтобы оставить пробел
  • заменить каждый экземпляр fooв пространстве шаблонов
  • взять все до маркера комментария из (модифицированного )пространства шаблонов, а все после него из (исходного )пространства удержания:

Итак,

$ sed -e '/!/h' -e 's/foo/bar/g' -e '/!/{G;s/!.*!/!/}' file
I want to replace this bar ! but not this foo
! I don't want to replace this foo
I want to replace this bar and this bar as well

Если вам нужно обработать регистр !символов в комментарии, например.

$ cat file
I want to replace this foo ! but not!!! this foo
!! I don't want to replace this foo !!
I want to replace this foo and this foo as well

тогда вы могли бы сделать что-то вроде

$ sed -e '/!/{s//\n&/;h}' -e 's/foo/bar/g' -e '/!/{G;s/\n.*\n//}' file
I want to replace this bar ! but not!!! this foo
!! I don't want to replace this foo !!
I want to replace this bar and this bar as well
2
18.03.2021, 22:26

Теги

Похожие вопросы