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

Concha de golpe

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 grepsin embargo, el comando es muy torpe.

grep -Pz '(?s)from.*n.*to' test

Esto hace algunas cosas:

  • -P Encender Regex 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 hasta toque 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 compatibilidad con expresiones regulares compatibles con Perl listas para usar, 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

Deja un comentario

En esta web usamos cookies para personalizar tu experiencia de usuario.    Política de cookies
Privacidad