Если шаблон не может встречаться в последовательных строках, можно просто выполнить
sed '$!N;/.*\n.*PATTERN.*/P;D' infile
Я объяснял здесь, как работает цикл N
;P
;D
. Разница в том, что здесь первая строка в пространстве шаблона печатается только в том случае, если вторая совпадает, иначе она удаляется.
Если шаблон может встречаться в последовательных строках, то приведенное выше решение выведет строку с совпадением, если за ней следует другая строка с совпадением.
Чтобы игнорировать последовательные совпадения, добавьте второе условие для печати первой строки в пространстве шаблона, только если она не совпадает:
sed '$!N;/.*\n.*PATTERN.*/{/.*PATTERN.*\n.*/!P;};D' infile
Другой способ, используя буфер удержания.
Если вы хотите игнорировать последовательные совпадения:
sed '/PATTERN/!{ # if line doesn't match PATTERN
h # copy pattern space content over the hold buffer
d # delete pattern space
}
//{ # if line matches PATTERN
x # exchange pattern space with hold space
//d # if line matches PATTERN delete it
}' infile
или, в одной строке
sed '/PATTERN/!{h;d;};//{x;//d;}' infile
Если вы не хотите игнорировать последовательные совпадения:
sed '/PATTERN/!{ # if line doesn't match PATTERN
h # copy pattern space content over the hold buffer
d # delete pattern space
}
//x # if line matches PATTERN exchange buffers
' infile
или, в одной строке
sed '/PATTERN/!{h;d;};//x' infile
Хотя имейте в виду, что решения, использующие буфер удержания, будут печатать ведущую пустую строку, если первая строка в вашем файле совпадает.
Это:
ACCEPT tcp -- 192.168.1.1 0.0.0.0/0 tcp dpt:53
ACCEPT udp -- 192.168.1.1 0.0.0.0/0 udp dpt:53
означает, что вы разрешаете исходящие запросы с 192.168.1.1 на порт 53. Вам понадобится аналогичное правило с исходным портом 53.