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

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

5 ответов

Решение

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

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

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

Пытаться pcregrep вместо обычного grep:

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

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

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

Пример:

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

Печать bar

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

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

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

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

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

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

grep $'\r'

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

в этой статье

Другие вопросы по тегам