Для тестирования только в терминале используйте:
sed '/[cr]at/d' file_name
Чтобы действительно удалить эти строки из файла, используйте:
sed -i '/[cr]at/d' file_name
Поскольку @muru избил меня до решения awk, вот подход Perl (но вместо этого используйте @ Muru, он проще и эффективнее):
perl -00ne 's#PAT.*/(.*)\n##; open($F,">","$1.txt"); s/\n\s*(\n|$)//g;
print $F "$_\n"' original.txt
-00 делает [ f6] обрабатывать абзацы как строки: «строка» («запись») представляет собой абзац, определенный пустой строкой. s#PAT.*/(.*)\n## удалит строку, начиная с PAT из записи, а скобки будут записывать последнее слово после / как $1. Затем мы открываем $1.txt для записи (open($F,">","$1.txt")) с файлом ручка $F. Следующий шаг, s/\n\s*\n//g; удаляет пустые строки и, наконец, текущая запись печатается в дескрипторе файла $F с помощью print $F "$_\n".
Чтобы использовать все после [ f17] как имя, попробуйте:
perl -00ne 's#PAT.*//(.*)\n##; $k=$1; $k=~s#[./]##g;open($F,">","$k.txt");
s/\n\s*(\n|$)//g; print $F "$_\n"' original.txt
На вашем примере это приведет к следующим файлам:
askubuntucompage01.txt
askubuntucompage02.txt
askubuntucompage03.txt
Также посмотрите на csplit (1):
csplit --suppress-matched --prefix page --suffix-format% 02d.txt original.txt '/ ^ PAT /' '{ *}