Cómo encontrar coincidencias de patrones en varias líneas con grep
grep
es una utilidad de búsqueda de texto de línea de comando que puede encontrar patrones y cadenas en archivos y otros tipos de entrada. La mayoría de las coincidencias coincidirán solo en una línea, pero a menudo es útil buscar coincidencias en varias líneas nuevas.
Coincidencia a través de múltiples líneas nuevas con grep
Manejar coincidencias multilínea es algo grep
tiene dificultad con. Una mejor herramienta para el trabajo es awk
o sed
, que manejan la entrada de varias líneas de forma natural. El uso de dos expresiones con una coma entre ellas coincidirá con todo lo que se encuentre entre esos dos patrones.
awk '/from/,/to/' file sed -n '/from/,/to/p' file
Todavía es posible manejar esto en grep
sin embargo, el comando es muy torpe.
grep -Pz '(?s)from.*n.*to' test
Esto hace algunas cosas:
-P
Activa la expresión regular compatible con Perl.-z
alimenta todo el archivo como una línea, con "cero bytes" en lugar de una nueva línea. Esto permite que grep procese todo como una sola línea.(?s)
activa PCRE_DOTALL, lo que hace que el.
carácter coincide con cualquier carácter, incluidas las líneas nuevas.from
es el partido inicial..*n.*
coincidirá con todo hastato
que es el partido final.
En general, esto lo hará para fines de secuencias de comandos, pero es mucho para recordar si está escribiendo esto usted mismo. También, usando el -o
marcar para imprimir solo la coincidencia también imprimirá un carácter de cero byte final, lo que puede causar problemas adicionales.
Usar pcre2grep en su lugar (grep compatible con Perl)
Regular grep
no es la mejor herramienta para el trabajo, y hay una alternativa llamada pcre2grep
que incluye soporte para Expresiones regulares compatibles con Perl desde el primer momento, y es capaz de hacer coincidir Regex multilínea muy fácilmente.
Probablemente esté instalado en su sistema, pero si no lo está, puede obtenerlo de su administrador de paquetes:
sudo apt install pcre2-utils
Luego, solo necesita ejecutarlo con el -M
parámetro.
pcre2grep -M 'from(n|.)*to' file
Tenga en cuenta que esto aún requiere que haga coincidir "nueva línea o cualquier carácter" manualmente con (n|.)*
. Como alternativa, puede utilizar el (?s)
truco para activar PCRE_DOTALL y hacer que el carácter de punto coincida con las nuevas líneas también.
pcre2grep -M '(?s)from.*to' file
Descubre más contenido