Sed с многострочным выбором с регулярным выражением - PullRequest
0 голосов
/ 05 сентября 2018

Мне нужно получить конвертированный файл (миграция брандмауэра), и он добавляет огромный раздел комментариев. Я хочу заменить все между ("").

Итак, в этом примере я хочу, чтобы вывод сказал:

set comments " "

Вот что я пробовал:

sed 's/.*set comments* ".*"/set comment "" /' %filename% >> %outputfilename%

Проблема в том, что некоторые «комментарии» имеют многострочный характер, и с моей командой это не учитывается. Так что те, в которых нет / r или / n, работают нормально.

Фактический файл

set action accept    
set comments "access-list inside_access_in extended permit udp host 10.2.55.131 host 192.168.0.65 eq snmp 
This policy is disabled as not allowed by NAT-Control."   
next

Ответы [ 3 ]

0 голосов
/ 05 сентября 2018

С GNU sed для -z и использованием -E для включения ERE:

$ sed -Ez 's/(set comment)s? "[^"]*"/\1 " "/g' file
set action accept
set comment " "
next

Выше не получится, если ваши комментарии могут включать двойные кавычки, экранированные или нет. Если это может произойти, вы должны включить его в пример ввода.

0 голосов
/ 05 сентября 2018

Это может сработать для вас (GNU sed):

sed '/set comments "/!b;:a;/"[^\\"]*\(\\.[^\\"]*\)*"/bb;N;ba;:b;s//" "/' file

При этом игнорируются строки, отличные от тех, которые содержат строку set comments ". Затем он проверяет, содержит ли строка закрывающие двойные кавычки без кавычек и, если нет, накапливает строки, пока не будет выполнено условие. Наконец, он удаляет все символы между начальными / конечными двойными кавычками и заменяет их одним пробелом.

P.S. Я подозреваю, что OP не имел в виду заменить comments на comment, однако это тривиальное изменение второго регулярного выражения и RHS команды подстановки, если она предназначена.

0 голосов
/ 05 сентября 2018

Требуется ли использовать sed?

perl -0777pe 's/set comments "[^"]*"/set comments " "/gm' input.txt

производит

set action accept    
set comments " "   
next

из вашего образца ввода.

(Если ваша строка комментария может включать в себя экранированные кавычки, это становится намного сложнее.)

...