Как дать шаблон для новой строки в grep? Новая строка в начале, новая строка в конце. Не способ регулярного выражения. Что-то вроде \ n.
$
. Он несколько ограничен, но применим в простых случаях.
Как дать шаблон для новой строки в grep? Новая строка в начале, новая строка в конце. Не способ регулярного выражения. Что-то вроде \ n.
$
. Он несколько ограничен, но применим в простых случаях.
Ответы:
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 (расширение POSIX grep
).\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 )
?
new line at the beginning
является пустой строкой иnew line at end
применяется к каждой строке в файле. Можете опубликовать пример?