sed удалить блок строк после шаблона1 по шаблон2, но не строку, соответствующую шаблону1?

Я изо всех сил пытаюсь использовать sed для работы с testfile.txt, и каждый раз, когда он встречает строку, начинающуюся delete_me: abc, он будет:

  1. оставьте строку delete_me: abc нетронутой
  2. но удалите все последующие строки, пока в файле не будет достигнута следующая пустая строка.

например. Мне нужен этот ввод:

delete_me: abc
sSAsaAaSA
AsaSAsaSAsa
asASAsS

^--- <blank line>

... заменить только на эту строку:

delete_me: abc

Я пытался:

sed '/delete_me/ {n;d}' jil_testfile.txt
# deletes only the first line after 'delete_me'

sed '/delete_me/,/^$/d' jil_testfile.txt
# nearly works but deletes the 'delete_me' line too which I want to stay preserved.

Любые предложения, пожалуйста?


person ClutchingatStraws    schedule 28.09.2018    source источник
comment
Как правило, если вам нужно сохранить состояние на нескольких строках, лучше использовать awk или perl, код будет чище.   -  person smci    schedule 28.09.2018
comment
Это другой вопрос, поскольку вы хотите удалить переменное количество строк после шаблона 1, пока не совпадете с шаблоном 2 (в вашем случае пустая строка). Более простая задача - это sed или awk: удалить n строк, следующих за узор   -  person smci    schedule 28.09.2018


Ответы (1)


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

sed -n ':a;/delete_me/{p;:b;n;//ba;bb};p' file

Печатайте строки как обычно до первого появления delete_me. Распечатайте эту строку и не печатайте дальнейшие строки, если эта строка не содержит delete_me.

Поскольку спецификация изменилась с тех пор, как я написал первое решение, вот новое:

sed -n '/delete_me/{p;:a;n;/^$/b;ba};p' file
person potong    schedule 28.09.2018