На этот вопрос уже есть ответ здесь:
Я использую 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 для нескольких шаблонов в нескольких строках?
Вопрос требует решения с помощью grep
, на который уже дан ответ в вопросе: grep -A9 if my_file | grep -B9 endif
. Решение не работает в моем случае, но будет работать в случае другого вопроса.
Предлагаемые 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
Предлагаемые решения ищут только шаблон, который начинается в начале строки, если я правильно интерпретирую предложенное решение. Даже если я удалю ^
, команда не работает.
Можно использовать sed
для этого:
sed -n '/if/,/endif/p' myfile
-n
ничего не печатают, пока мы не просим его /if/
, находят, что первая строка с этим ,
продолжает идти до... /endif/
это - последняя строка, которую мы хотим p
, печатают подобранные строки Решение awk
могло быть похожим: awk '/if/,/endif/' file
, Конечно, это подобно решению с sed
.
Традиционный 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