Confié mucho en pcregrep, pero con grep más nuevo no necesita instalar pcregrep para muchas de sus características. Solo usagrep -P
.
En el ejemplo de la pregunta del OP, creo que las siguientes opciones funcionan bien, con la segunda mejor coincidencia de cómo entiendo la pregunta:
grep -Pzo "abc(.|\n)*efg" /tmp/tes*
grep -Pzl "abc(.|\n)*efg" /tmp/tes*
Copié el texto como / tmp / test1 y eliminé la 'g' y lo guardé como / tmp / test2. Aquí está el resultado que muestra que el primero muestra la cadena coincidente y el segundo muestra solo el nombre del archivo (típico -o es para mostrar coincidencia y típico -l es para mostrar solo el nombre del archivo). Tenga en cuenta que la 'z' es necesaria para multilínea y '(. | \ N)' significa que coincide con 'cualquier cosa que no sea nueva línea' o 'nueva línea', es decir, cualquier cosa:
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
Para determinar si su versión es lo suficientemente nueva, ejecute man grep
y vea si algo similar a esto aparece cerca de la parte superior:
-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.
Eso es de GNU grep 2.10.