Come trovare le corrispondenze di pattern in più righe con grep

Come trovare le corrispondenze di pattern in più righe con grep

grep è un’utilità di ricerca del testo della riga di comando che può trovare modelli e stringhe in file e altri tipi di input. La maggior parte delle corrispondenze corrisponderà a una sola riga, ma è spesso utile abbinare più nuove righe.

Corrispondenza di più newline con grep

Gestire le partite su più righe è qualcosa grep con cui lottano. Lo strumento migliore per questo lavoro è awk o sed, che gestisce naturalmente l’input multilinea. L’uso di due espressioni con una virgola tra di loro corrisponderà a qualsiasi cosa tra questi due modelli.

awk '/from/,/to/' file

sed -n '/from/,/to/p' file

È ancora possibile farlo in grep, tuttavia il comando è molto goffo.

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

Questo fa diverse cose:

  • -PInclude un’espressione regolare compatibile con Perl .
  • -z passa l’intero file come una singola stringa con “byte nulli” invece di una nuova riga. Ciò consente a grep di elaborare tutto come una singola riga.
  • (?s) attiva PCRE_DOTALL, che fa . corrispondere il carattere a qualsiasi carattere, comprese le nuove righe.
  • from partita iniziale.
  • .*n.* corrisponderà a tutto fino a to, che è la partita finale.

In generale, questo verrà fatto per scopi di scripting, ma è molto da ricordare se lo stai digitando da solo. Inoltre, l’utilizzo -o del flag per stampare solo la corrispondenza stamperà anche il byte nullo di terminazione, che può causare ulteriori problemi.

Usando invece pcre2grep (grep compatibile con Perl)

Regular grep non è lo strumento migliore per il lavoro, e c’è un’alternativa chiamata pcre2grep , che include il supporto per le espressioni regolari compatibili con Perl fuori dagli schemi e può abbinare molto facilmente espressioni regolari su più righe.

Probabilmente è installato sul tuo sistema, ma in caso contrario, puoi ottenerlo dal tuo gestore di pacchetti:

sudo apt install pcre2-utils

Quindi devi solo eseguirlo con un -M parametro.

pcre2grep -M 'from(n|.)*to' file

Tieni presente che ciò richiede comunque la corrispondenza manuale di “nuova riga o qualsiasi carattere” con (n|.)* . In alternativa, puoi usare (?s) il trucco per abilitare PCRE_DOTALL e fare in modo che il carattere del punto corrisponda alla nuova riga.

pcre2grep -M '(?s)from.*to' file

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *