Основываясь на некоторых произвольных файлах в Интернете(1 и 2 ), я придумал оператор sed, который заменяет пробелы после текста, который выглядит как команда (буквы и символы подчеркивания )с одной вкладкой:
sed 's/^\([a-z_][a-z_]*\) */\1\t/' input > output
Экранированная скобка захватывает команду (одну или несколько букв и знаков подчеркивания, начиная с начала строки (^
)), затем требует одного или нескольких пробелов после этой команды; эти шаблоны заменяются соответствующей командой(\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