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

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

Ответ 1

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

Однако вы можете найти пустые строки следующим образом:

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

Ответ 2

попробуйте pcregrep вместо обычного grep:

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

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

Ответ 3

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

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

Ответ 4

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

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

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