Это удалит фрагмент текста, который начинается и заканчивается пустой строкой, начинающейся с четвертой пустой строки.Также удаляются эти разделительные линии.
sed -n '/^$/!{p;b};H;x;/^\(\n[^\n]*\)\{4\}/{:a;n;/^$/!ba;d};x;p' inputfile
Измените первый /^$/
, чтобы изменить начальное совпадение.Измените второй, чтобы изменить конечное совпадение.
Учитывая этот ввод:
aaa
---
bbb
---
ccc
---
ddd delete me
eee delete me
===
fff
---
ggg
Эта версия команды:
sed -n '/^---$/!{p;b};H;x;/^\(\n[^\n]*\)\{3\}/{:a;n;/^===$/!ba;d};x;p' inputfile
даст это в результате:
aaa
---
bbb
---
ccc
fff
---
ggg
Редактировать:
Я удалил постороннюю инструкцию b
из команд sed
выше.
Вот закомментированная версия:
sed -n ' # don't print by default
/^---$/!{ # if the input line doesn't match the begin block marker
p; # print it
b}; # branch to end of script and start processing next input line
H; # line matches begin mark, append to hold space
x; # swap pattern space and hold space
/^\(\n[^\n]*\)\{3\}/{ # if what was in hold consists of 3 lines
# in other words, 3 copies of the begin marker
:a; # label a
n; # read the next line
/^===$/!ba; # if it's not the end of block marker, branch to :a
d}; # otherwise, delete it, d branches to the end automatically
x; # swap pattern space and hold space
p; # print the line (it's outside the block we're looking for)
' inputfile # end of script, name of input file
Любой однозначный шаблон должен работать для маркеров начала и конца.Они могут быть одинаковыми или разными.