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 solo coincidirán con una línea, pero a menudo es útil hacer coincidir varias líneas nuevas.
Coincidencia de múltiples saltos de línea con grep
Manejar coincidencias de varias líneas es algo grep
con lo que luchan. La mejor herramienta para este trabajo es awk
o sed
, que naturalmente maneja la entrada de varias líneas. El uso de dos expresiones con una coma entre ellas coincidirá con cualquier cosa entre esos dos patrones.
awk '/from/,/to/' file
sed -n '/from/,/to/p' file
Todavía es posible hacer esto en grep
, sin embargo, el comando es muy torpe.
grep -Pz '(?s)from.*n.*to' test
Esto hace varias cosas:
-P
Incluye una expresión regular compatible con Perl .-z
pasa el archivo completo como una sola cadena con «bytes nulos» 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 coincida con cualquier carácter, incluidas las líneas nuevas.from
partido inicial..*n.*
coincidirá con todo hastato
, que es la coincidencia final.
En general, esto se hará con fines de secuencias de comandos, pero es mucho para recordar si lo escribe usted mismo. Además, usar -o
la bandera para imprimir solo la coincidencia también imprimirá el byte nulo final, lo que puede causar problemas adicionales.
Usando 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 listas para usar y puede hacer coincidir expresiones regulares de varias líneas 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
Entonces solo necesita ejecutarlo con un -M
parámetro.
pcre2grep -M 'from(n|.)*to' file
Tenga en cuenta que esto aún requiere que haga coincidir manualmente «nueva línea o cualquier carácter» con (n|.)*
. Alternativamente, puede usar (?s)
el truco para habilitar PCRE_DOTALL y hacer que el carácter de punto coincida con la nueva línea.
pcre2grep -M '(?s)from.*to' file
Deja una respuesta