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