Разделить файл на две строки перед шаблоном

Это почти идентичный вопрос для разбиения файла на две части по шаблону, но вместо того, чтобы иметь строки до XYZ в file1 в примере file.txt :

 ABC EFG XYZ HIJ KNL 

Я хочу, чтобы XYZ был включен в file2 (но XYZ по-прежнему является шаблоном для разделения). Теперь я использую этот ответ: https://unix.stackexchange.com/a/202516/108861, а затем добавив последнюю строку из file1 в начало file2 и удалив ее из file1 , но есть ли более простая, линейное решение?

  • Awk: сопоставить точную строку в строке
  • Найти только сопоставленный шаблон в файле CSV
  • Добавить текст до конца каждой строки
  • Есть два способа установить awk vars через командную строку?
  • Я хочу найти дубликаты в файле и добавить символ в конец строки в первом совпадении
  • Печать первого и последнего совпадений поля с awk
  • Замена строки в файле
  • Разделить текстовый файл по строке и переименовать на основе содержимого строки
  • Как подключить сортировку к gawk?
  • Извлечение имени файла и строки из нескольких файлов
  • Найти изображения по размеру: find / file / awk
  • Различия между sed на Mac OSX и другим «стандартным» sed?
  • 2 Solutions collect form web for “Разделить файл на две строки перед шаблоном”

    Очень легко изменить мое решение на другой вопрос. Просто удалите next :

     perl -ne 'if(/XYZ/){$a=1} ; $a==1 ? print STDERR : print STDOUT;' file >f1 2>f2; 

    Это создаст f1 со всем, вплоть до XYZ и f2 со всем остальным, включая XYZ .


    В качестве альтернативы, принятый ответ от связанного с вами вопроса уже делает в значительной степени то, что вам нужно. Он просто сохраняет XYZ в первом файле. Чтобы иметь его во втором, просто инвертируйте две команды awk :

     awk '/XYZ/{out="file2"}{print >out}; ' out=file1 file 

    Другой вариант (с sed )

     sed '/XYZ/,${ w file2 d }' file >file1 
    Linux и Unix - лучшая ОС в мире.