Можно просто использоватьed
ed -s infile <<\IN
.t.
1,?===?d
$d
,p
q
IN
Как это работает:t
дублирует текущую(.
)строку -, которая всегда является последней строкой при запуске ed
(на тот случай, если разделитель присутствует в последней строке ), 1,?===?d
удаляет все строки до предыдущего совпадения включительно(ed
остается в последней строке )затем $d
удаляет (дубликат )последнюю строку, ,p
печатает текстовый буфер (заменить с w
для редактирования файла на месте )и, наконец, q
выход ed
.
Если вы знаете, что во входных данных есть хотя бы один разделитель (, и вам все равно, напечатан ли он ), тогда
sed 'H;/===/h;$!d;x' infile
будет короче.
Как это работает :добавляет все строки в H
старый буфер, перезаписывает h
старый буфер при обнаружении совпадения, d
удаляет все строки, кроме одной $
t, когда он x
изменяет буферы (и автопечатает ).