Я хочу искать и заменять шаблон

Я хочу искать каждую запись (записи определяются пустыми строками) в файле для шаблона NAME#AAAA . Если он совпадает, тогда вставьте # перед age записи и вставьте age NIL линии age NIL в конце записи.

INPUT FILE:

 NAME#AAAA STD 1 SEC A AGE 5 NAME#BBBB STD 2 SEC B AGE 6 NAME#CCCC STD 3 SEC C AGE 7 NAME#AAAA STD 4 AGE 9 NAME#AAAA STD 7 SEC A AGE 12 

ОЖИДАЕМЫЙ ВЫХОД

 NAME#AAAA STD 1 SEC A #AGE 5 AGE NIL NAME#BBBB STD 2 SEC B AGE 6 NAME#CCCC STD 3 SEC C AGE 7 NAME#AAAA STD 4 #AGE 9 AGE NIL NAME#AAAA STD 7 SEC A #AGE 12 AGE NIL 

  • Обработка текста и экспорт содержимого на лист Excel
  • Команда для удаления первого N числа строк на входе
  • (Mac Terminal) sed для анализа JSON ... что я делаю неправильно?
  • Как печатать строки между одним и тем же шаблоном с мулинированием?
  • grep: Как найти консоль для закрытия?
  • разделение файла в файле
  • Печать только git commit sha и шаблон с помощью sed
  • Bubble a до b с sed
  • One Solution collect form web for “Я хочу искать и заменять шаблон”

    Всякий раз, когда вы видите записи, разделенные пустыми строками («абзацы», если хотите), режим абзаца Perl часто является хорошим решением:

     $ perl -00lpe 'if(/NAME#AAAA/){s/\bAGE\s/#$&/; s/$/\nAGE NIL/;}' file NAME#AAAA STD 1 SEC A #AGE 5 AGE NIL NAME#BBBB STD 2 SEC B AGE 6 NAME#CCCC STD 3 SEC C AGE 7 NAME#AAAA STD 4 #AGE 9 AGE NIL NAME#AAAA STD 7 SEC A #AGE 12 AGE NIL 

    объяснение

    • -00 : это активирует режим абзаца perl, где каждый «абзац» (группа непустых строк до пустого) рассматривается как «строка».
    • -l : удаляет последние строки из каждой входной записи (каждый абзац) и добавляет новую строку для каждого вызова print . -pe : печатать каждый входной регистратор, используя сценарий, заданный -e ему.

    Таким образом, эти флаги делают perl чтения поверх входного файла, применяя сценарий к каждой записи, а затем печатают результат. Сам скрипт делает:

    • if(/NAME#AAAA/) : если эта запись соответствует NAME#AAAA .
    • s/\bAGE\s/#$&/ : s/foo/bar/ является оператором подстановки. Он заменит foo на bar . Здесь я заменяю AGE , которому предшествует # . \b соответствует границам слов и исключает такие вещи, как ADAGE из матча. $& – специальная переменная и означает «все, что было сопоставлено. Итак, s/\bAGE\s/#$&/ заменит AGE на #AGE .
    • s/$/\nAGE NIL/ : $ соответствует концу записи. Поэтому замена его на что-то еще добавит к концу записи. Эта команда добавляет AGE NIL в конец согласованной записи.

    Обратите внимание, что все операции здесь чувствительны к регистру. Если вам понадобится нечувствительность к регистру, используйте это вместо этого:

     perl -00lpe 'if(/NAME#AAAA/i){s/\bAGE\s/#$&/i; s/$/\nAGE NIL/i;}' file 
    Linux и Unix - лучшая ОС в мире.