печатать различное количество строк до и после шаблона

У меня есть каталог с тысячами файлов со следующим повторяющимся шаблоном, содержащим сотни разделов –

############### # Section 1 ############### some text more text some more text some text more text some more text ############### # Section 2 ############### some text more text some more text interesting-pattern some text more text some more text ############### # Section 3 ############### some text more text some more text some text more text some more text 

Что мне нужно сделать, так это выяснить способ извлечь всю СЕКУНДУ, где существует «интересный шаблон».

Я попытался сделать grep -iEr 'интересный шаблон' с флагами -A и -B, но это не работает, потому что в каждом файле может быть разное количество строк в секции до и после шаблона интерстинга.

Каков наилучший способ сделать это?

  • libnotify с bash и grep
  • Как сравнить несколько столбцов одного файла с одним столбцом другого и отображать совпадения из второго файла?
  • Как я могу найти, какие csv-файлы связаны (т. Е. Имеют ссылки на внешние ключи) другим?
  • Использование grep / sort / find для извлечения уникальных значений
  • «Grep» доступное пространство с выхода «df»
  • Как совместить число в одном файле с именем в другом файле?
  • Перенаправление циклических команд grep для разделения файлов
  • grep путается именами файлов с тире
  • One Solution collect form web for “печатать различное количество строк до и после шаблона”

    Это не работа для grep, но для лучшего инструмента, такого как awk.

    Легким обходным путем является использование gnu awk с настраиваемым разделителем данных RS, например Section .

    Используя слово «Раздел» для разделения строк, все, что находится между словами Section 1 и Section 2 будет рассматриваться как одна строка для awk.
    То же самое для раздела 2 – раздел 3 и т. Д.

    Теперь вам нужно только напечатать правильную строку «line» = «line», которая содержит interesting-pattern .

     $ awk -v RS="# Section " '/interesting-pattern/{print RT $0}' file1 # Section 2 ############### some text more text some more text interesting-pattern some text more text some more text ############### 

    Поскольку gnu awk может принимать регулярное выражение в RS (Record Separator), вы также можете применить в RS нечто более сложное:

     $ awk -v RS="###############\n# Section " '/interesting-pattern/{print RT $0}' ############### # Section 2 ############### some text more text some more text interesting-pattern some text more text some more text 

    PS: {print RT указывает awk на печать используемого в настоящее время разделителя записей

    Linux и Unix - лучшая ОС в мире.