Successivo: , Su: Operatori di espressioni regolari   [Contenuti][Indice]


3.3.1 Operatori di regexp in awk

Le sequenze di protezione descritte prima in Sequenze di protezione sono valide all’interno di una regexp. Sono precedute da una ‘\’ e sono riconosciute e convertite nei caratteri reali corrispondenti nella primissima fase dell’elaborazione delle regexp.

Ecco una lista dei metacaratteri. Tutti i caratteri che non sono sequenze di protezione e che non sono elencati qui rappresentano se stessi:

\

Si usa per togliere il significato speciale a un carattere quando si effettuano confronti. Per esempio, ‘\$’ individua il carattere ‘$’.

^

Si usa per indicare l’inizio di una stringa. Per esempio, ‘^@chapter’ individua ‘@chapter’ all’inizio di una stringa e si può usare per identificare inizi di capitoli in file sorgenti Texinfo. Il simbolo ‘^’ è conosciuto come àncora, perché àncora la ricerca solo all’inizio della stringa.

È importante notare che ‘^’ non individua un inizio di riga (il punto subito dopo un ritorno a capo ‘\n’) che si trovi all’interno di una stringa. La condizione non è verificata nell’esempio seguente:

if ("riga1\nRIGA 2" ~ /^R/) …
$

Simile a ‘^’, ma serve a indicare la fine di una stringa. Per esempio, ‘p$’ individua un record che termina con la lettera ‘p’. Il ‘$’ è un’àncora e non individua una fine di riga (il punto immediatamente prima di un carattere di ritorno a capo ‘\n’) contenuta in una stringa. La condizione nell’esempio seguente non è verificata:

if ("riga1\nRIGA 2" ~ /1$/) …
. (punto)

Individua un qualsiasi carattere, incluso il carattere di ritorno a capo. Per esempio, ‘.P’ individua ogni carattere in una stringa che sia seguito da una ‘P’. Usando la concatenazione, si può formare un’espressione regolare come ‘U.A’, che individua qualsiasi sequenza di tre caratteri che inizia con ‘U’ e finisce con ‘A’.

In modalità POSIX stretta (vedi la sezione Opzioni sulla riga di comando), ‘.’ non individua il carattere NUL, ossia il carattere con tutti i bit uguali a zero. In altri contesti, NUL è solo un carattere qualsiasi. Altre versioni di awk possono non essere in grado di individuare il carattere NUL.

[]

Questa è chiamata una espressione tra parentesi quadre.16 Individua uno qualsiasi dei caratteri racchiusi tra parentesi quadre. Per esempio, ‘[MVX]’ individua uno qualsiasi dei caratteri ‘M’, ‘V’, o ‘X’ in una stringa. Una spiegazione esauriente di quel che si può mettere all’interno di un’espressione tra parentesi quadre è data in Usare espressioni tra parentesi quadre.

[^]

Questa è una espressione tra parentesi quadre complementata. Il primo carattere dopo la ‘[deve essere un ‘^’. Individua qualsiasi carattere tranne quelli tra parentesi quadre. Per esempio, ‘[^awk]’ individua qualsiasi carattere che non sia una ‘a’, ‘w’, o ‘k’.

|

Questo è un operatore alternativa ed è usato per specificare delle alternative. La ‘|’ ha la precedenza più bassa tra tutti gli operatori di espressioni regolari. Per esempio, ‘^P|[aeiouy]’ individua tutte le stringhe corrispondenti a ‘^P’ oppure a ‘[aeiouy]’. Ciò significa che individua qualsiasi stringa che inizi con ‘P’ o contenga (in qualsiasi posizione al suo interno) una vocale inglese minuscola.

L’alternativa si applica alle regexp più ampie individuabili in ogni lato.

()

Le parentesi sono usate per raggruppare, sia nelle espressioni regolari sia in quelle aritmetiche. Si possono usare per concatenare espressioni regolari che contengono l’operatore alternativa, ‘|’. Per esempio, ‘@(samp|code)\{[^}]+\}’ individua sia ‘@code{pippo}’ sia ‘@samp{pluto}’. (Queste sono sequenze in linguaggio Texinfo per controllare la formattazione. Il significato di ‘+’ è spiegato più avanti in questa lista.)

La parentesi sinistra (di apertura) è sempre un metacarattere; per cercare una corrispondenza letterale con una tale parentesi, occorre farla precedere da una barra inversa. Comunque, la parentesi destra (di chiusura) è speciale solo se esiste la relativa parentesi sinistra; una parentesi destra senza la corrispondente parentesi sinistra è considerata (senza dare alcun messaggio di avviso) come un normale carattere.

*

Questo simbolo richiede che la precedente espressione regolare sia ripetuta tante volte quanto serve per trovare una corrispondenza. Per esempio, ‘ph*’ applica il simbolo ‘*’ al carattere ‘h’ che lo precede immediatamente e ricerca corrispondenze costituite da una ‘p’ seguita da un numero qualsiasi di ‘h’. Viene individuata anche solo la ‘p’, se non ci sono ‘h’.

Ci sono due sfumature da capire sul funzionamento di ‘*’. Primo, ‘*’ tiene conto solo del singolo componente dell’espressione regolare che lo precede (p.es., in ‘ph*’ vale solo per ‘h’). Per fare sì che ‘*’ si applichi a una sottoespressione più estesa, occorre metterla tra parentesi: ‘(ph)*’ individua ‘ph’, ‘phph’, ‘phphph’ e così via.

Secondo, ‘*’ trova quante più ripetizioni siano possibili. Se il testo da ricercare è ‘phhhhhhhhhhhhhhooey’, ‘ph*’ individua tutte le ‘h’.

+

Questo simbolo è simile a ‘*’, tranne per il fatto che l’espressione precedente deve essere trovata almeno una volta. Questo significa che ‘wh+y’ individuerebbe ‘why’ e ‘whhy’, ma non ‘wy’, mentre ‘wh*y’ li troverebbe tutti e tre.

?

Questo simbolo è simile a ‘*’, tranne per il fatto che l’espressione che precede può essere trovata una volta sola oppure non trovata affatto. Per esempio, ‘fe?d’ individua ‘fed’ e ‘fd’, ma nient’altro.

{n}
{n,}
{n,m}

Uno o due numeri tra parentesi graffe rappresentano una espressione di intervallo. Se c’è un numero tra graffe, la regexp precedente è ripetuta n volte. Se ci sono due numeri separati da una virgola, la regexp precedente è ripetuta da n a m volte. Se c’è un numero seguito da una virgola, allora la regexp precedente è ripetuta almeno n volte:

wh{3}y

Riconosce ‘whhhy’, ma non ‘why’ o ‘whhhhy’.

wh{3,5}y

Riconosce soltanto ‘whhhy’, ‘whhhhy’, o ‘whhhhhy’.

wh{2,}y

Riconosce ‘whhy’, ‘whhhy’ e così via.

Nelle espressioni regolari, gli operatori ‘*’, ‘+’, e ‘?’, come pure le parentesi graffe ‘{’ e ‘}’, hanno la precedenza più alta, seguite dalla concatenazione, e poi da ‘|’. Come nell’algebra, le parentesi possono cambiare il raggruppamento degli operatori.

In POSIX awk e gawk, gli operatori ‘*’, ‘+’ e ‘?’ rappresentano se stessi quando non c’è nulla prima di essi nella regexp. Per esempio, /+/ individua un semplice segno più. Tuttavia, molte altre versioni di awk trattano una tale notazione come un errore di sintassi.


Note a piè di pagina

(16)

In altri testi, un’espressione tra parentesi quadre potrebbe essere definita come insieme di caratteri, classe di caratteri o lista di caratteri.


Successivo: , Su: Operatori di espressioni regolari   [Contenuti][Indice]