Cómo encontrar coincidencias de patrones en varias líneas con grep

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:

  • -PIncluye 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 hasta to, 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

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *