Stream Editor - espressioni regolari
Sono le espressioni regolari che rendono SED potente ed efficiente. Numerose attività complesse possono essere risolte con espressioni regolari. Qualsiasi esperto della riga di comando conosce la potenza delle espressioni regolari.
Come molte altre utilità GNU / Linux, anche SED supporta le espressioni regolari, che vengono spesso chiamate regex. Questo capitolo descrive le espressioni regolari in dettaglio. Il capitolo è diviso in tre sezioni: espressioni regolari standard, classi POSIX di espressioni regolari e caratteri Meta.
Espressioni regolari standard
Inizio della riga (^)
Nella terminologia delle espressioni regolari, il simbolo dell'accento circonflesso (^) corrisponde all'inizio di una riga. L'esempio seguente stampa tutte le righe che iniziano con il motivo "The".
[jerry]$ sed -n '/^The/ p' books.txt
Eseguendo il codice sopra, ottieni il seguente risultato:
The Two Towers, J. R. R. Tolkien
The Alchemist, Paulo Coelho
The Fellowship of the Ring, J. R. R. Tolkien
The Pilgrimage, Paulo Coelho
Fine riga ($)
La fine della riga è rappresentata dal simbolo del dollaro ($). L'esempio seguente stampa le righe che terminano con "Coelho".
[jerry]$ sed -n '/Coelho$/ p' books.txt
Eseguendo il codice sopra, ottieni il seguente risultato:
The Alchemist, Paulo Coelho
The Pilgrimage, Paulo Coelho
Singolo carattere (.)
Il punto (.) Corrisponde a qualsiasi carattere singolo tranne il carattere di fine riga. L'esempio seguente stampa tutte e tre le parole della lettera che terminano con il carattere "t".
[jerry]$ echo -e "cat\nbat\nrat\nmat\nbatting\nrats\nmats" | sed -n '/^..t$/p'
Eseguendo il codice sopra, ottieni il seguente risultato:
cat
bat
rat
mat
Corrispondenza set di caratteri ([])
Nella terminologia delle espressioni regolari, un set di caratteri è rappresentato da parentesi quadre ([]). Viene utilizzato per abbinare solo uno dei diversi caratteri. L'esempio seguente corrisponde ai modelli "Call" e "Tall" ma non "Ball".
[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[CT]all/ p'
Eseguendo il codice sopra, ottieni il seguente risultato:
Call
Tall
Set esclusivo ([^])
Nell'insieme esclusivo, il cursore nega l'insieme di caratteri tra parentesi quadre. L'esempio seguente stampa solo "Ball".
[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[^CT]all/ p'
Eseguendo il codice sopra, ottieni il seguente risultato:
Ball
Intervallo di caratteri ([-])
Quando viene fornito un intervallo di caratteri, l'espressione regolare corrisponde a qualsiasi carattere all'interno dell'intervallo specificato tra parentesi quadre. Il seguente esempio corrisponde a "Call" e "Tall" ma non a "Ball".
[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[C-Z]all/ p'
Eseguendo il codice sopra, ottieni il seguente risultato:
Call
Tall
Ora modifichiamo l'intervallo in "AP" e osserviamo il risultato.
[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[A-P]all/ p'
Eseguendo il codice sopra, ottieni il seguente risultato:
Call
Ball
Zero in una volta (\?)
In SED, il punto interrogativo (\?) Corrisponde a zero o una occorrenza del carattere precedente. L'esempio seguente corrisponde a "Behavior" e "Behavior". Qui, abbiamo creato "u" come carattere opzionale utilizzando "\?".
[jerry]$ echo -e "Behaviour\nBehavior" | sed -n '/Behaviou\?r/ p'
Eseguendo il codice sopra, ottieni il seguente risultato:
Behaviour
Behavior
Una o più occorrenze (\ +)
In SED, il simbolo più (\ +) corrisponde a una o più occorrenze del carattere precedente. L'esempio seguente corrisponde a una o più occorrenze di "2".
[jerry]$ echo -e "111\n22\n123\n234\n456\n222" | sed -n '/2\+/ p'
Eseguendo il codice sopra, ottieni il seguente risultato:
22
123
234
222
Zero o più occorrenze (*)
Gli asterischi (*) corrispondono a zero o più occorrenze del carattere precedente. Il seguente esempio corrisponde a "ca", "cat", "catt" e così via.
[jerry]$ echo -e "ca\ncat" | sed -n '/cat*/ p'
Eseguendo il codice sopra, ottieni il seguente risultato:
ca
cat
Esattamente N occorrenze {n}
{n} corrisponde esattamente a "n" occorrenze del carattere precedente. L'esempio seguente stampa solo numeri a tre cifre. Ma prima, devi creare il seguente file che contiene solo numeri.
[jerry]$ cat numbers.txt
Eseguendo il codice sopra, ottieni il seguente risultato:
1
10
100
1000
10000
100000
1000000
10000000
100000000
1000000000
Scriviamo l'espressione SED.
[jerry]$ sed -n '/^[0-9]\{3\}$/ p' numbers.txt
Eseguendo il codice sopra, ottieni il seguente risultato:
100
Nota che la coppia di parentesi graffe è preceduta dal carattere "\".
Almeno n occorrenze {n,}
{n,} corrisponde ad almeno "n" occorrenze del carattere precedente. L'esempio seguente stampa tutti i numeri maggiori o uguali a cinque cifre.
[jerry]$ sed -n '/^[0-9]\{5,\}$/ p' numbers.txt
Eseguendo il codice sopra, ottieni il seguente risultato:
10000
100000
1000000
10000000
100000000
1000000000
Da M a N Occorrenza {m, n}
{m, n} trova almeno "m" e al massimo "n" occorrenze del carattere precedente. L'esempio seguente stampa tutti i numeri con almeno cinque cifre ma non più di otto cifre.
[jerry]$ sed -n '/^[0-9]\{5,8\}$/ p' numbers.txt
Eseguendo il codice sopra, ottieni il seguente risultato:
10000
100000
1000000
10000000
Tubo (|)
In SED, il carattere pipe si comporta come un'operazione OR logica. Corrisponde agli elementi da entrambi i lati del tubo. Il seguente esempio corrisponde a "str1" o "str3".
[jerry]$ echo -e "str1\nstr2\nstr3\nstr4" | sed -n '/str\(1\|3\)/ p'
Eseguendo il codice sopra, ottieni il seguente risultato:
str1
str3
Notare che la coppia di parentesi e pipe (|) è preceduta dal carattere "\".
Caratteri in fuga
Ci sono alcuni caratteri speciali. Ad esempio, la nuova riga è rappresentata da "\ n", il ritorno a capo è rappresentato da "\ r" e così via. Per utilizzare questi caratteri in un contesto ASCII regolare, dobbiamo eseguire l'escape utilizzando il carattere barra (\). Questo capitolo illustra come sfuggire ai caratteri speciali.
Escaping "\"
L'esempio seguente corrisponde al modello "\".
[jerry]$ echo 'str1\str2' | sed -n '/\\/ p'
Eseguendo il codice sopra, ottieni il seguente risultato:
str1\str2
Escaping "\ n"
L'esempio seguente corrisponde al nuovo carattere di riga.
[jerry]$ echo 'str1\nstr2' | sed -n '/\\n/ p'
Eseguendo il codice sopra, ottieni il seguente risultato:
str1\nstr2
Escaping "\ r"
L'esempio seguente corrisponde al ritorno a capo.
[jerry]$ echo 'str1\rstr2' | sed -n '/\\r/ p'
Eseguendo il codice sopra, ottieni il seguente risultato:
str1\rstr2
Escaping "\ dnnn"
Corrisponde a un carattere il cui valore ASCII decimale è "nnn". L'esempio seguente corrisponde solo al carattere "a".
[jerry]$ echo -e "a\nb\nc" | sed -n '/\d97/ p'
Eseguendo il codice sopra, ottieni il seguente risultato:
a
Escaping "\ onnn"
Corrisponde a un carattere il cui valore ASCII ottale è "nnn". L'esempio seguente corrisponde solo al carattere "b".
[jerry]$ echo -e "a\nb\nc" | sed -n '/\o142/ p'
Eseguendo il codice sopra, ottieni il seguente risultato:
b
Corrisponde a un carattere il cui valore ASCII esadecimale è "nnn". L'esempio seguente corrisponde solo al carattere "c".
[jerry]$ echo -e "a\nb\nc" | sed -n '/\x63/ p'
Eseguendo il codice sopra, ottieni il seguente risultato:
c
Classi POSIX di espressioni regolari
Ci sono alcune parole riservate che hanno un significato speciale. Queste parole riservate sono indicate come classi POSIX di espressioni regolari. Questa sezione descrive le classi POSIX supportate da SED.
[: alnum:]
Implica caratteri alfabetici e numerici. L'esempio seguente corrisponde solo a "Uno" e "123", ma non corrisponde al carattere di tabulazione.
[jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:alnum:]]/ p'
Eseguendo il codice sopra, ottieni il seguente risultato:
One
123
[:alfa:]
Implica solo caratteri alfabetici. L'esempio seguente corrisponde solo alla parola "Uno".
[jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:alpha:]]/ p'
Eseguendo il codice sopra, ottieni il seguente risultato:
One
[: blank:]
Implica un carattere vuoto che può essere spazio o tabulazione. L'esempio seguente corrisponde solo al carattere di tabulazione.
[jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:space:]]/ p' | cat -vte
Eseguendo il codice sopra, ottieni il seguente risultato:
^I$
Notare che il comando "cat -vte" viene utilizzato per mostrare i caratteri di tabulazione (^ I).
[: digit:]
Implica solo numeri decimali. Il seguente esempio corrisponde solo alla cifra "123".
[jerry]$ echo -e "abc\n123\n\t" | sed -n '/[[:digit:]]/ p'
Eseguendo il codice sopra, ottieni il seguente risultato:
123
[:inferiore:]
Implica solo lettere minuscole. L'esempio seguente corrisponde solo a "uno".
[jerry]$ echo -e "one\nTWO\n\t" | sed -n '/[[:lower:]]/ p'
Eseguendo il codice sopra, ottieni il seguente risultato:
one
[:superiore:]
Implica solo lettere maiuscole. Il seguente esempio corrisponde solo a "TWO".
[jerry]$ echo -e "one\nTWO\n\t" | sed -n '/[[:upper:]]/ p'
Eseguendo il codice sopra, ottieni il seguente risultato:
TWO
[: punct:]
Implica segni di punteggiatura che includono caratteri non spazi o alfanumerici
[jerry]$ echo -e "One,Two\nThree\nFour" | sed -n '/[[:punct:]]/ p'
Eseguendo il codice sopra, ottieni il seguente risultato:
One,Two
[:spazio:]
Implica caratteri di spazio bianco. Il seguente esempio lo illustra.
[jerry]$ echo -e "One\n123\f\t" | sed -n '/[[:space:]]/ p' | cat -vte
Eseguendo il codice sopra, ottieni il seguente risultato:
123^L^I$
Metacaratteri
Come le espressioni regolari tradizionali, SED supporta anche i metacaratteri. Queste sono espressioni regolari in stile Perl. Notare che il supporto dei metacaratteri è specifico per GNU SED e potrebbe non funzionare con altre varianti di SED. Parliamo in dettaglio dei metacaratteri.
Confine parola (\ b)
Nella terminologia delle espressioni regolari, "\ b" corrisponde al confine della parola. Ad esempio, "\ bthe \ b" corrisponde a "" ma non a "questi", "lì", "loro", "allora" e così via. Il seguente esempio lo illustra.
[jerry]$ echo -e "these\nthe\nthey\nthen" | sed -n '/\bthe\b/ p'
Eseguendo il codice sopra, ottieni il seguente risultato:
the
Confine non di parole (\ B)
Nella terminologia delle espressioni regolari, "\ B" corrisponde al confine non di parola. Ad esempio, "la \ B" corrisponde a "questi" e "loro" ma non a "il". Il seguente esempio lo illustra.
[jerry]$ echo -e "these\nthe\nthey" | sed -n '/the\B/ p'
Eseguendo il codice sopra, ottieni il seguente risultato:
these
they
Spazio bianco singolo (\ i)
In SED, "\ s" implica un singolo carattere di spazio vuoto. Il seguente esempio corrisponde a "Line \ t1" ma non a "Line1".
[jerry]$ echo -e "Line\t1\nLine2" | sed -n '/Line\s/ p'
Eseguendo il codice sopra, ottieni il seguente risultato:
Line 1
Singolo spazio non vuoto (\ S)
In SED, "\ S" implica un singolo carattere di spazio bianco. Il seguente esempio corrisponde a "Line2" ma non a "Line \ t1".
[jerry]$ echo -e "Line\t1\nLine2" | sed -n '/Line\S/ p'
Eseguendo il codice sopra, ottieni il seguente risultato:
Line2
Carattere parola singola (\ w)
In SED, "\ w" implica caratteri di una sola parola, cioè caratteri alfabetici, cifre e trattino basso (_). Il seguente esempio lo illustra.
[jerry]$ echo -e "One\n123\n1_2\n&;#" | sed -n '/\w/ p'
Eseguendo il codice sopra, ottieni il seguente risultato:
One
123
1_2
Carattere singolo non alfanumerico (\ W)
In SED, "\ W" implica un singolo carattere non alfanumerico che è esattamente opposto a "\ w". Il seguente esempio lo illustra.
[jerry]$ echo -e "One\n123\n1_2\n&;#" | sed -n '/\W/ p'
Eseguendo il codice sopra, ottieni il seguente risultato:
&;#
Inizio dello spazio del pattern (\ `)
In SED, "\` "implica l'inizio dello spazio del pattern. L'esempio seguente corrisponde solo alla parola "Uno".
[jerry]$ echo -e "One\nTwo One" | sed -n '/\`One/ p'
Eseguendo il codice sopra, ottieni il seguente risultato:
One