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


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

5 60

5 ответов:

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

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

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

попробовать pcregrep вместо grep:

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

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

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

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

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

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

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

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

пример:

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

печать bar