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

95

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

Tuxnani
источник
6
Непонятно чего ты хочешь. new line at the beginningявляется пустой строкой и new line at endприменяется к каждой строке в файле. Можете опубликовать пример?
PP
2
На самом деле вы можете просто использовать $. Он несколько ограничен, но применим в простых случаях.
Krzysztof Jabłoński
1
gnu.org/software/grep/manual/grep.html#Usage см. пункт 15.
Ярно,

Ответы:

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

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

только что нашел

grep $'\r'

Он используется $'\r'для экранирования в стиле c в Bash.

в этой статье

HHHartmann
источник