GNU/Linux >> Linux Esercitazione >  >> Linux

Espressioni regolari:mettere tutto insieme

In Introduzione alle espressioni regolari , ho introdotto il concetto e le nozioni di base, quindi in Iniziare con le espressioni regolari:un esempio , abbiamo esaminato un esempio che pulisce elenchi di nomi e indirizzi e-mail in modo che siano coerenti e analizzabili. Dopo la nostra immersione in Regex e grep:flusso di dati e blocchi predefiniti , dove siamo entrati più in dettaglio sulle espressioni regolari, è giunto il momento di esplorare i modi in cui possiamo abbreviare e semplificare il programma da riga di comando dal primo esempio. Ci concentreremo qui su grep e sed .

Esempio:semplificare il programma della mailing list

Per prima cosa, diamo un'occhiata al nostro primo esempio, in cui abbiamo creato il seguente programma di interfaccia a riga di comando (CLI):

cat Experiment_6-1.txt | grep -v Team | grep -v "^\s*$" | sed -e "s/[Ll]eader//" -e "s/\[//g" -e "s/]//g" -e "s/)//g" -e "s/(//g" | awk '{print $1" "$2" <"$3">"}'

Potresti trovare le espressioni regolari più facili da leggere a questo punto, ma questo programma può essere semplificato.

gatto e grep

Iniziamo concentrandoci sull'inizio del comando, che coinvolge cat e grep :

cat Experiment_6-1.txt | grep -v Team | grep -v "^\s*$"

Possiamo combinare i due grep dichiarazioni, che originariamente assomigliano a questa:

| grep -v Team | grep -v "^\s*$" 

Suggerimento: Quando lo STDOUT da grep non viene inviato tramite pipe tramite un'altra utility e, quando si utilizza un emulatore di terminale che supporta il colore, le corrispondenze regex vengono evidenziate nel flusso di dati di output.

Il comando rivisto è:

grep -vE "Team|^\s*$"

Qui abbiamo aggiunto la E opzione, che specifica la regex estesa. Secondo il grep pagina man:

"In GNU grep non c'è differenza nelle funzionalità disponibili tra la sintassi di base e quella estesa."

Questa affermazione non è strettamente vera, perché la nostra nuova espressione combinata ha esito negativo senza la E opzione. Esegui quanto segue per vedere i risultati:

[student@studentvm1 testing]$ cat Experiment_6-1.txt | grep -vE "Team|^\s*$"

Provalo senza la E opzione.

Ora, diamo un'occhiata a cat . Il grep lo strumento può anche leggere i dati da un file, quindi possiamo eliminare il cat comando interamente:

[student@studentvm1 testing]$ grep -vE "Team|^\s*$" Experiment_6-1.txt

Questa modifica e la precedente insieme ci lasciano con il seguente programma CLI in qualche modo semplificato:

grep -vE "Team|^\s*$" Experiment_6-1.txt | sed -e "s/[Ll]eader//" -e "s/\[//g" -e "s/]//g" -e "s/)//g" -e "s/(//g" | awk '{print $1" "$2" <"$3">"}'

Questo comando è più breve, più conciso e verrà eseguito più velocemente perché grep deve analizzare il flusso di dati solo una volta.

Nota: Ancora una volta, è importante rendersi conto che questa soluzione non è l'unica. Ci sono diversi metodi in Bash per produrre lo stesso output e ci sono anche altri linguaggi come Python e Perl che possono essere usati. E, naturalmente, ci sono sempre le macro di LibreOffice Writer. Ma posso sempre contare su Bash come parte di qualsiasi distribuzione Linux. Posso eseguire queste attività utilizzando i programmi Bash su qualsiasi computer Linux, anche uno senza un desktop GUI o uno che ha un desktop GUI ma non ha LibreOffice installato.

sed

Possiamo anche semplificare il sed comando. Il sed L'utilità non solo consente di cercare il testo che corrisponde a un modello regex, ma può anche modificare, eliminare o sostituire il testo corrispondente. Uso sed dalla riga di comando e negli script della shell Bash come un modo semplice e veloce per individuare il testo e modificarlo. Il nome sed sta per stream editor perché opera sui flussi di dati allo stesso modo di altri strumenti che possono trasformare un flusso di dati. La maggior parte di queste modifiche comporta la selezione di linee specifiche dal flusso di dati e il loro passaggio a un altro programma di trasformazione.

Nota: Molte persone chiamano strumenti come grep Programmi di filtraggio , perché filtrano le righe indesiderate dal flusso di dati. Preferisco il termine trasformatori , perché strumenti come sed e awk fare di più che filtrare. Possono testare il contenuto per varie combinazioni di stringhe e modificare il contenuto corrispondente in molti modi diversi. Strumenti come sort , head , tail , uniq , fmt e altro ancora, trasformano in qualche modo il flusso di dati.

Abbiamo già visto sed in azione, ma ora, con una comprensione delle espressioni regolari, possiamo analizzare e comprendere meglio il nostro utilizzo precedente. È possibile combinare quattro delle cinque espressioni usate nel sed comando in un'unica espressione. Il sed comando ora ha due espressioni invece di cinque:

sed -e "s/[Ll]eader//" -e "s/[]()\[]//g"

Questo formato rende un po' difficile comprendere l'espressione più complessa. Nota che non importa quante espressioni un singolo sed comando contiene, il flusso di dati viene analizzato solo una volta per corrispondere a tutte le espressioni.

Esaminiamo più da vicino l'espressione rivista:

-e "s/[]()\[]//g"

Per impostazione predefinita, sed interpreta tutti i [ caratteri come l'inizio di un set e l'ultimo ] personaggio come fine di quel set. Quindi, nel codice sopra, il primo [ e l'ultimo ] contenere l'insieme. Il ] intermedio i caratteri non vengono interpretati come metacaratteri.

Dal momento che dobbiamo abbinare [ come carattere letterale per rimuoverlo dal flusso di dati e sed normalmente interpreta [ come metacarattere, dobbiamo sfuggire ad esso in modo che venga interpretato come un letterale ] . È qui che la barra rovesciata (\ ) entra, dandoci \[ nel mezzo.

Inseriamo questa nuova versione nello script CLI e la testiamo:

[student@studentvm1 testing]$ grep -vE "Team|^\s*$" Experiment_6-1.txt | sed -e "s/[Ll]eader//" -e "s/[]()\[]//g"

So cosa stai chiedendo:"Perché non inserire il \[ dopo il [ che apre il set e prima del ] personaggio?" Prova come ho fatto io:

[student@studentvm1 testing]$  grep -vE "Team|^\s*$" Experiment_6-1.txt | sed -e "s/[Ll]eader//" -e "s/[\[]()]//g"`

Penso che dovrebbe funzionare, ma non è così. Piccoli risultati inaspettati come questo chiariscono che dobbiamo stare attenti e testare attentamente ogni regex per assicurarci che faccia effettivamente ciò che intendiamo.

Dopo alcuni miei esperimenti, ho scoperto che la parentesi quadra sinistra sfuggita \[ funziona bene in tutte le posizioni dell'espressione tranne la prima. Questo comportamento è notato in grep pagina man, che probabilmente avrei dovuto leggere prima. Tuttavia, trovo che la sperimentazione rafforzi le cose che leggo e di solito scopro cose più interessanti di quelle che stavo cercando.

Aggiungendo l'ultimo componente, il awk dichiarazione, il nostro programma ottimizzato si presenta così e i risultati sono esattamente quello che vogliamo:

[student@studentvm1 testing]$ grep -vE "Team|^\s*$" Experiment_6-1.txt | sed -e "s/[Ll]eader//" -e "s/[]()\[]//g" | awk '{print $1" "$2" <"$3">"}'

Altri strumenti che implementano espressioni regolari

Molti strumenti Linux implementano espressioni regolari. La maggior parte di queste implementazioni sono molto simili a quella di awk , grep e sed , quindi dovrebbe essere facile imparare le differenze. Sebbene non abbiamo esaminato in dettaglio awk, è un potente linguaggio di elaborazione del testo che implementa anche le espressioni regolari.

La maggior parte degli editor di testo più avanzati utilizza le espressioni regolari. Vim, gVim, Kate e GNU Emacs non fanno eccezione. Il less l'utilità implementa le espressioni regolari, così come la funzione di ricerca e sostituzione di LibreOffice Writer.

Linguaggi di programmazione come Perl, awk e Python contengono anche implementazioni di espressioni regolari, il che li rende adatti alla scrittura di strumenti per la manipolazione del testo.

Risorse

Ho trovato alcune risorse eccellenti per l'apprendimento delle espressioni regolari. Ce ne sono più di quelli che ho elencato qui, ma questi sono quelli che ho trovato particolarmente utili:

  • Il grep la pagina man ha un buon riferimento ma non è appropriata per imparare le espressioni regolari.
  • Il libro di O'Reilly, Padroneggiare le espressioni regolari , di Jeffrey E. F. Friedl, è un buon tutorial e riferimento per le espressioni regolari. Lo consiglio a chiunque sia o voglia essere un amministratore di sistema Linux perché utilizzerai espressioni regolari.
  • Il libro di O'Reilly sed &awk:UNIX Power Tools , di Arnold Robbins e Dale Dougherty, è un'altra buona. Copre entrambi questi potenti strumenti e offre anche un'eccellente discussione sulle espressioni regolari.

Ci sono anche alcuni buoni siti web che possono aiutarti a conoscere le espressioni regolari e che forniscono esempi di espressioni regolari in stile libro di cucina interessanti e utili. Ci sono alcuni che chiedono soldi in cambio del loro utilizzo. Jason Baker, il mio revisore tecnico per i volumi 1 e 2 del mio Uso e amministrazione di Linux Il corso suggerisce regexcrossword.com come un buon strumento di apprendimento.

Riepilogo

Questa serie ha fornito una breve introduzione al complesso mondo delle espressioni regolari. Abbiamo esplorato l'implementazione della regex in grep utility abbastanza approfondita per darti un'idea di alcune delle cose straordinarie che possono essere realizzate con le espressioni regolari. Abbiamo anche esaminato diversi strumenti Linux e linguaggi di programmazione che implementano anche espressioni regolari.

Ma non commettere errori! Abbiamo solo graffiato la superficie di questi strumenti e delle espressioni regolari. C'è molto altro da imparare e, come puoi vedere, ci sono alcune eccellenti risorse per farlo.

Nota: Questo articolo è una versione leggermente modificata del Capitolo 6 del Volume 2 del mio corso di autoapprendimento su Linux, "Using and Administering Linux:Zero to SysAdmin", in uscita da Apress alla fine del 2019.


Linux
  1. Espressioni regolari avanzate nel comando Grep con 10 esempi - Parte II

  2. Espressioni regolari nel comando Grep con 10 esempi - Parte I

  3. Elenca tutti i dispositivi ALSA

  4. Cosa significa \b in un pattern grep?

  5. Espressione regolare per trovare caratteri doppi in Bash

Iniziare con le espressioni regolari

Espressioni regolari in Grep (Regex)

Come Grep per più stringhe e pattern

Come eseguire la ricerca Grep su tutti i file e in tutte le directory

10 esempi pratici di regex con grep

grep estrarre l'intervallo di numeri