Это может работать для вас (GNU sed):
sed '/4/{:a;$!{N;/6/Md;ba}}' file
Создайте свой собственный l oop и удаляйте только накопленные строки в пространстве образца, если выполнено условие конца.
NB Флаг M
в конечном состоянии разрешает совпадения для нескольких строк, собранных в пространстве образца.
/start/,/end/d
- это структура управления, которая при обнаружении start
немедленно удаляет строки до end
или конец файла. Поэтому существует два условия end , адрес /end/
или $
. Поскольку действие (в данном случае удаление) является немедленным, его нельзя отменить, если не выполнено условие /end/
, по этой причине подлежащие удалению строки должны быть собраны и удалены или не зависеть от одного из двух условий, * /end/
(удалить) или $
(не удалять).
/4/{...}
начальный адрес действий в фигурных скобках. :a
адрес начало al oop с именем a
$!{...}
, если не конец действия с файлом в фигурных скобках. N
добавьте новую строку, а затем следующую строку в пространство шаблона. /6/Md
конечный адрес и команда удаления, если найдены, т.е. это удалит все строки в пространстве шаблона, которые были добавлены командой N
. ba
команда goto, прерывается на адрес l oop a
. Это позволяет механизму l oop продолжаться до тех пор, пока одно из двух условий /6/
или $
.
NB Если условие конца файла выполнено, /4/{...}
заканчивается и накопленное строки печатаются как обычно.