Я сильно полагался на pcregrep, но с более новым grep вам не нужно устанавливать pcregrep для многих его функций. Просто используйте grep -P
.
В примере с вопросом OP, я думаю, что следующие варианты работают хорошо, со вторым лучшим соответствием, как я понимаю вопрос:
grep -Pzo "abc(.|\n)*efg" /tmp/tes*
grep -Pzl "abc(.|\n)*efg" /tmp/tes*
Я скопировал текст как / tmp / test1, удалил «g» и сохранил как / tmp / test2. Вот выходные данные, показывающие, что первый показывает совпадающую строку, а второй показывает только имя файла (типично -o - показать совпадение, а типичное -l - показать только имя файла). Обратите внимание, что «z» необходимо для многострочного, а «(. | \ N)» означает совпадение с «чем-либо, кроме newline» или «newline» - т.е. с чем угодно:
user@host:~$ grep -Pzo "abc(.|\n)*efg" /tmp/tes*
/tmp/test1:abc blah
blah blah..
blah blah..
blah blah..
blah efg
user@host:~$ grep -Pzl "abc(.|\n)*efg" /tmp/tes*
/tmp/test1
Чтобы определить, является ли ваша версия достаточно новой, запустите man grep
и посмотрите, появляется ли что-то похожее на это сверху:
-P, --perl-regexp
Interpret PATTERN as a Perl regular expression (PCRE, see
below). This is highly experimental and grep -P may warn of
unimplemented features.
Это из GNU grep 2.10.