Intereting Posts
Изменение корневой файловой системы во встроенной системе Как использовать OCR из командной строки в Linux? FreeBSD не перезагружается домен lynx показывает ошибку 404 при запуске из localhost Как найти имя пакета Nix для его установки в файле configuration.nix? Перемещение / загрузка раздела без испорчения системы tmux new pane имеет домашний каталог по умолчанию вместо предыдущего каталога Гиперпоточность, не обнаруженная Linux матч и замена в PNG-файле SSH: Почему моя система предлагает мой закрытый ключ при попытке аутентификации с открытым ключом? Ошибка скручивания NSS / SSL после обновления `sed: -e выражение # 1, char 4: неизвестная команда:` но окончательные строки в порядке Что происходит с приостановленными заданиями в unix? Каков самый простой способ подключения к беспроводной сети в системе Debian, но ничего существенного? Почему ddrescue медленный, когда он может быть быстрее в областях без ошибок?

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

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

############### # 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, но это не работает, потому что в каждом файле может быть разное количество строк в секции до и после шаблона интерстинга.

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

Это не работа для 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 на печать используемого в настоящее время разделителя записей