С помощью GNU sed
вместе с включенным механизмом расширенных регулярных выражений мы можем решить эту проблему. Пространство удержания содержит все строки, которые необходимо переместить на север, а пространство шаблона содержит несовпадающие строки.
$ sed -Ee '
/_005|_007/{
/\n/!{
H;$!d;g;s/.//;b
}
G
s/(.*\n.*)(\n.*)(\n\n.*)/\1\3\2/
h;s/.*\n(\n)/\1/
x;s/\n\n.*//
$bend
s/^/\n/;D
}
$bend
N;s/^/\n/;D
:end
x;G;s/.//
' input.txt
Perl поддерживает два массива для хранения совпадающих и несовпадающих строк:
$ perl -ne 'push @{/_005|_007/ ? \@A : \@B}, $_}{print @A, @B' input.txt