Как дать шаблон для новой строки в 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 (расширение для POSIXgrep
).\s
соответствовать символам пробела; если последует*
также соответствует пустой строке.^
соответствует началу строки.$
соответствует концу строки.
Что касается обходного пути (без использования непереносимых -P
), вы можете временно заменить символ новой строки на другой и заменить его обратно, например:
grep -o "_foo_" <(paste -sd_ file) | tr -d '_'
В основном это ищет точное соответствие _foo_
где _
средства \n
(так __
знак равно \n\n
). Вам не нужно переводить его обратно tr '_' '\n'
, так как каждый шаблон будет напечатан в новой строке в любом случае, поэтому удаление _
достаточно.