Непонятно чего ты хочешь. new line at the beginningявляется пустой строкой и new line at endприменяется к каждой строке в файле. Можете опубликовать пример?
PP
2
На самом деле вы можете просто использовать $. Он несколько ограничен, но применим в простых случаях.
По крайней мере, в GNU grep есть опция -z, которая разбивает строки grep нулевым символом. Однако похоже, что он не поддерживает новую строку или \ n в шаблоне для соответствия новой строке, см. Отчет об ошибке .
Ярно
1
@jarno Он поддерживает \ n в шаблонах с флагом -P
rubystallion 09
92
попробуйте pcregrepвместо обычного grep:
pcregrep -M "pattern1.*\n.*pattern2" filename
эта -Mопция позволяет ему соответствовать нескольким строкам, поэтому вы можете искать новые строки как \n.
-Pэто расширение GNU. Я могу использовать его, когда этого требует ситуация (обычно lookahead / lookbehind), но POSIX grep может сделать это просто с помощью файла [[:space:]].
jordanm
1
В man-страницах grep FWIW, Solaris и BSD (другие не проверял) есть параграфы для -P. В любом случае GNU вполне стандартен. :)
K3 --- rnc
1
Со страницы руководства: [-P] Эта опция не поддерживается во FreeBSD.
Замечательно, обратите внимание, что я не получаю уведомления о "@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
2
только что нашел
grep $'\r'
Он используется $'\r'для экранирования в стиле c в Bash.
new line at the beginning
является пустой строкой иnew line at end
применяется к каждой строке в файле. Можете опубликовать пример?$
. Он несколько ограничен, но применим в простых случаях.Ответы:
grep
шаблоны сопоставляются с отдельными строками, поэтому шаблон не может соответствовать новой строке, найденной во входных данных.Однако вы можете найти такие пустые строки:
grep '^$' file grep '^[[:space:]]*$' file # include white spaces
источник
попробуйте
pcregrep
вместо обычногоgrep
:pcregrep -M "pattern1.*\n.*pattern2" filename
эта
-M
опция позволяет ему соответствовать нескольким строкам, поэтому вы можете искать новые строки как\n
.источник
Вы можете использовать этот способ ...
grep -P '^\s$' file
-P
используется для регулярных выражений Perl (расширение POSIXgrep
).\s
сопоставить символы пробела; если за ним следует*
, он также соответствует пустой строке.^
соответствует началу строки.$
соответствует концу строки.источник
-P
это расширение GNU. Я могу использовать его, когда этого требует ситуация (обычно lookahead / lookbehind), но POSIX grep может сделать это просто с помощью файла[[:space:]]
.-P
. В любом случае GNU вполне стандартен. :)brew install grep
получить GNU grep, которая превосходит по нескольким параметрам. apple.stackexchange.com/questions/193288/…Благодаря @jarno я знаю о параметре -z и выяснил, что при использовании GNU grep с параметром -P сопоставление
\n
возможно . :)Пример:
grep -zoP 'foo\n\K.*'<<<$'foo\nbar'
Печать
bar
источник
Что касается обходного пути (без использования непереносимого
-P
), вы можете временно заменить символ новой строки другим и вернуть его обратно, например:grep -o "_foo_" <(paste -sd_ file) | tr -d '_'
В основном он ищет точное совпадение,
_foo_
где_
означает\n
(так__
=\n\n
). Вам не нужно переводить его обратноtr '_' '\n'
, так как каждый узор все равно будет напечатан в новой строке, поэтому_
достаточно удалить .источник
<(p paste -sd_ file )
?только что нашел
grep $'\r'
Он используется
$'\r'
для экранирования в стиле c в Bash.в этой статье
источник