Точнее
Some text
begin
Some text goes here.
end
Some more text
и я хочу извлечь весь блок, который начинается с «начала» до «конца».
с помощью awk мы можем сделать как awk '/begin/,/end/' text
.
Как сделать с grep?
Точнее
Some text
begin
Some text goes here.
end
Some more text
и я хочу извлечь весь блок, который начинается с «начала» до «конца».
с помощью awk мы можем сделать как awk '/begin/,/end/' text
.
Как сделать с grep?
Ответы:
Обновлено 18 ноября 2016 г. (поскольку изменено поведение grep: grep с параметром -P теперь не поддерживает
^
и$
привязывает [в Ubuntu 16.04 с ядром v: 4.4.0-21-generic]) ( неверное (не) исправление )примечание: для других команд просто замените якоря '^' & '$' на якорь новой строки
'\n'
______________________________С помощью команды grep:
Если вы не хотите включать шаблоны «начало» и «конец» в результат, используйте grep с поддержкой Lookbehind и Lookahead.
Также вы можете использовать
\K
notify вместо утверждения Lookbehind.\K
опция игнорировать все до сопоставления с шаблоном и игнорировать сам шаблон.\n
используется для предотвращения печати пустых строк из вывода.Или, как предполагает @AvinashRaj, есть простой простой grep:
(?s)
сообщает grep, что точка должна соответствовать символам новой строки.[\s\S]
соответствует любому символу, который является пробелом или не пробелом.И их вывод без включения «начало» и «конец» выглядит следующим образом:
смотрите полный тест всех команд здесь ( устарел, поскольку поведение grep с параметром -P изменено )
Замечания:
^
укажите начало линии и$
укажите конец линии. они добавляются вокруг «начала» и «конца», чтобы соответствовать им, если они находятся в одной строке.В двух командах я избежал,
$
потому что он также использует для «Подстановка команд» ($(command)
), которая позволяет вывод команды заменить имя команды.От человека grep:
источник
grep -Pzo "(?<=begin\n)(.|\n)*(?=\nend)" file
чтобы не печатать\n
символ, который существует в начале строки.grep -Pzo "(?s)begin.*?end" file
grep -Pzo "begin[\s\S]*?end" file
grep: ein nicht geschütztes ^ oder $ wird mit -Pz nicht unterstützt
grep: a not protected ^ or $ is not supported with -Pz
grep
кажется, изменилось.Если вы
grep
не поддерживаете синтаксис perl (-P
), вы можете попробовать объединить строки, соответствующие шаблону, а затем снова развернуть строки, как показано ниже:источник