grep - показывать строки до определенного шаблона [дубликат]

Я использую Ubuntu 16.04, и я хочу искать файлы, скажем, «если», и я хочу выводить до «endif».Файл может выглядеть так

if …
  SOME CODE
endif

Я могу сделать это с помощью grep -A9, если my_file | grep -B9 endif . Это не работает, если предложение «if» больше 9, и если несколько предложений «if» находятся в одном файле, и если первая команда grep содержит несколько предложений «if». Параметр -m1 во втором grep не помогает. Вложенные предложения «if» можно игнорировать. У кого-нибудь есть идея, может быть, не с помощью grep?

Отличие от Как мне использовать grep для нескольких шаблонов в нескольких строках?

  1. Вопрос требует решения с помощью grep , на который уже дан ответ в вопросе: grep -A9 if my_file | grep -B9 endif . Решение не работает в моем случае, но будет работать в случае другого вопроса.

  2. Предлагаемые grep решения другого вопроса не работают (с Ubuntu?): grep: ein nicht geschütztes ^ oder $ wird mit -Pz nicht unterstützt. , что-то вроде grep: незащищенные ^ или $ не поддерживаются с -Pz . Я использую следующее:

     root: / tmp # cat file 
    Некоторый текст 
    begin 
    Здесь идет некоторый текст. 
    end 
    Еще текст 
    root: / tmp # grep -Pzo "^ begin \ $ (. | \ N) * ^ end $" file 
    grep : ein nicht geschütztes ^ oder $ wird mit -Pz nicht unterstützt 
     
  3. Предлагаемые решения ищут только шаблон, который начинается в начале строки, если я правильно интерпретирую предложенное решение. Даже если я удалю ^ , команда не работает.

8
задан 13 April 2017 в 05:23

3 ответа

Можно использовать sed для этого:

sed -n '/if/,/endif/p' myfile
  • -n ничего не печатают, пока мы не просим его
  • /if/, находят, что первая строка с этим
  • , продолжает идти до...
  • /endif/ это - последняя строка, которую мы хотим
  • p, печатают подобранные строки
20
ответ дан 23 November 2019 в 05:21

Решение awk могло быть похожим: awk '/if/,/endif/' file

, Конечно, это подобно решению с sed.

4
ответ дан 23 November 2019 в 05:21

Традиционный grep ориентирован на строку. Чтобы сделать многострочные соответствия, или необходимо одурачить его в прихлебывание целого файла путем сообщения ему, что вход пустой завершенный, например,

grep -zPo '(?s)\nif.*\nendif' file

, или используйте более гибкий инструмент такой в качестве pcregrep

pcregrep -M '(?s)\nif.*?\nendif' file

, или сам жемчуг

perl -00 -ne 'print if m/^if.*?endif/s' file

, С другой стороны, для соответствия структурировал вход подобным grep способом, существует sgrep

sgrep '"if" .. ("endif") containing "SOME CODE"' file
6
ответ дан 23 November 2019 в 05:21

Другие вопросы по тегам:

Похожие вопросы: