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:
-P
Include 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 ato
, 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