Как дать шаблон для новой строки в 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применяется к каждой строке в файле. Можете опубликовать пример?