Это может сработать для вас (GNU sed):
echo -e "a\nyyyy\nxxxx\nzzzz\nb" | sed 'N;/^xxxx/M{/^xxxx/d;$!N;d};P;D'
a
b
Это сохраняет окно из двух строк в пространстве шаблона, и если требуемое регулярное выражение найдено в первой или второй строке, читает следующую строку, а затем удаляет все три строки. Крайние случаи - это когда регулярное выражение найдено в первой или последней строках, когда нет строки до / после. В этих случаях можно удалить только две строки.
Кстати, это решение могло выявить возможную ошибку в GNU sed. Флаг M
адреса позволяет использовать метасимволы ^
и $
в качестве маркеров нулевой длины в регулярном выражении для начала и конца строки в многострочных строках. Пустой адрес //
повторно использует ранее указанный адрес. Должен ли этот адрес содержать многострочный флаг? В настоящее время он, кажется, включает флаг, даже если он не указан, т.е.
sed 'N;/^xxxx/M{/^xxxx/d;$!N;d};P;D' file
дает другой (правильный) результат для:
sed 'N;/^xxxx/M{//d;$!N;d};P;D' file
, если xxxx
появляется во второй строке файла.