Как дать шаблон для новой строки в grep?


95

Как дать шаблон для новой строки в grep? Новая строка в начале, новая строка в конце. Не способ регулярного выражения. Что-то вроде \ n.


6
Непонятно чего ты хочешь. new line at the beginningявляется пустой строкой и new line at endприменяется к каждой строке в файле. Можете опубликовать пример?
PP

2
На самом деле вы можете просто использовать $. Он несколько ограничен, но применим в простых случаях.
Krzysztof Jabłoński

Ответы:


84

grep шаблоны сопоставляются с отдельными строками, поэтому шаблон не может соответствовать новой строке, найденной во входных данных.

Однако вы можете найти такие пустые строки:

grep '^$' file
grep '^[[:space:]]*$' file # include white spaces 

По крайней мере, в GNU grep есть опция -z, которая разбивает строки grep нулевым символом. Однако похоже, что он не поддерживает новую строку или \ n в шаблоне для соответствия новой строке, см. Отчет об ошибке .
Ярно

1
@jarno Он поддерживает \ n в шаблонах с флагом -P
rubystallion 09

92

попробуйте pcregrepвместо обычного grep:

pcregrep -M "pattern1.*\n.*pattern2" filename

эта -Mопция позволяет ему соответствовать нескольким строкам, поэтому вы можете искать новые строки как \n.


22

Вы можете использовать этот способ ...

grep -P '^\s$' file
  • -Pиспользуется для регулярных выражений Perl (расширение POSIX grep).
  • \sсопоставить символы пробела; если за ним следует *, он также соответствует пустой строке.
  • ^соответствует началу строки. $соответствует концу строки.

2
-Pэто расширение GNU. Я могу использовать его, когда этого требует ситуация (обычно lookahead / lookbehind), но POSIX grep может сделать это просто с помощью файла [[:space:]].
jordanm

1
В man-страницах grep FWIW, Solaris и BSD (другие не проверял) есть параграфы для -P. В любом случае GNU вполне стандартен. :)
K3 --- rnc

1
Со страницы руководства: [-P] Эта опция не поддерживается во FreeBSD.
Marián Černý

Нет [-P] для MacOsX либо: grep [-abcdDEFGHhIiJLlmnOopqRSsUVvwxZ] [-A число] [-B число] [-C [число]] [-e шаблон] [-f файл] [--binary-files = значение] [--color [= when]] [--colour [= when]] [--context [= num]] [--label] [--line-buffered] [--null] [шаблон] [файл. ..]
Никколо

@ Niccolò Вы захотите brew install grepполучить GNU grep, которая превосходит по нескольким параметрам. apple.stackexchange.com/questions/193288/…
herdrick

19

Благодаря @jarno я знаю о параметре -z и выяснил, что при использовании GNU grep с параметром -P сопоставление \nвозможно . :)

Пример:

grep -zoP 'foo\n\K.*'<<<$'foo\nbar'

Печать bar


1
Замечательно, обратите внимание, что я не получаю уведомления о "@jarno" в ответе.
Ярно

3
Это круто! Большое спасибо, что поделились!
Алисия Тан

6

Что касается обходного пути (без использования непереносимого -P), вы можете временно заменить символ новой строки другим и вернуть его обратно, например:

grep -o "_foo_" <(paste -sd_ file) | tr -d '_'

В основном он ищет точное совпадение, _foo_где _означает \n(так __= \n\n). Вам не нужно переводить его обратно tr '_' '\n', так как каждый узор все равно будет напечатан в новой строке, поэтому _достаточно удалить .


извините за мое незнание, но используется ли подстановка процесса, не совместимая с NON posix, следовательно, непереносимая функция? в оболочке posix я не мог сделать <(p paste -sd_ file )?
humanityANDpeace

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.