Как я могу использовать sed для вставки текста после многострочного совпадения?

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

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

Я скопировал /lib/systemd/system/icinga2.serviceи недостающий /etc/default/icinga2через scpс рабочей машины на свой хост.

с этого момента я получил ошибки icinga2, потому что там все еще отсутствуют файлы конфигурации. Я скопировал их на свою машину, и все снова заработало... теперь я могу сосредоточиться на своей первоначальной проблеме... gdb...:)

Спасибо за ответы

2
03.08.2019, 12:30
4 ответа

Как насчет использования цикла?

sed '/^#nvram = \[/{
:a                          
N                                                  
/\n#\]/!ba                                                                  
a\
foobar
}
' sample.txt

Пояснение:

:a              # begin loop
N               # append next line to pattern space
/\n#\]/!ba      # if we haven't matched the end marker yet, branch back to a
a\              # append after loop exits
foobar

По крайней мере, в GNU sed это можно записать в один -лайнер

sed -e '/^#nvram = \[/{:a; N; /\n#\]/!ba; a\foobar' -e '}' sample.txt
2
27.01.2020, 21:55

С GNU sed для-z:

$ sed -z 's/#nvram = \[.*\]/&\nfoobar\n/' file
lots of text
lots of text


#nvram = [
#   these
#   could
#   be,
#   anything
#]
foobar

lots of text
lots of text

Возможно, вам потребуется настроить регулярное выражение в зависимости от того, что вы на самом деле подразумеваете под «что угодно» (, например. может ли он содержать])и есть ли в вашем файле другие подобные блоки.

Это было бы более надежным, например, если anythingне включает ]и у вас есть другие подобные блоки во входных данных:

sed -z 's/#nvram = \[[^]]*\]/&\nfoobar\n/' file
1
27.01.2020, 21:55

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

$ sed -e '
   /^#nvram = \[$/,/^#]$/!b
   /^#]$/a\
Foobar
' sample.txt

Мне лично не нравится вышесказанное и делаю несколько иначе:

$ sed -e '
   /^#nvram = \[$/,/^#]$/!b
   /^#]$/G
   s/\n/&Foobar/
' sample.txt
1
27.01.2020, 21:55

Вот еще простой sed:

sed '/#nvram = \[/,/#]/ s/#]/#]\nfoobar/' file

Он находит строку, в которой встречается #nvram = [, а затем все строки после нее и до тех пор, пока не будет адресовано первое вхождение #], затем вы заменяете #]\nfoobarна #].

1
27.01.2020, 21:55

Теги

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