Successivo: , Precedente: , Su: Espressioni regolari   [Contenuti][Indice]


3.2 Sequenze di protezione

Alcuni caratteri non possono essere inclusi letteralmente in costanti stringa ("pippo") o in costanti regexp (/pippo/). Vanno invece rappresentati usando sequenze di protezione, ossia sequenze di caratteri preceduti da una barra inversa (‘\’). Una sequenza di protezione può essere usata per includere un carattere di "doppio apice" in una costante stringa. Poiché un semplice doppio apice termina la stringa, va usato ‘\"’ per richiedere che un doppio apice sia presente all’interno di una stringa. Per esempio:

$ awk 'BEGIN { print "Egli le disse \"ciao!\"." }'
-| Egli le disse "ciao!".

Lo stesso carattere di barra inversa è un altro carattere che non può essere incluso normalmente; occorre scrivere ‘\\’ per inserire una barra inversa nella stringa o regexp. Quindi, la stringa costituita dai due caratteri ‘"’ e ‘\’ deve essere scritta come "\"\\".

Altre sequenze di protezione rappresentano caratteri non stampabili come TAB o il ritorno a capo. Anche se è possibile immettere la maggior parte dei caratteri non stampabili direttamente in una costante stringa o regexp, essi possono non essere di facile comprensione.

La seguente lista elenca tutte le sequenze di protezione usate in awk e cosa rappresentano. Se non è detto altrimenti, tutte queste sequenze di protezione valgono sia per costanti stringa che per costanti regexp:

\\

Barra inversa letterale, ‘\’.

\a

Il carattere “campanello”, Ctrl-g, codice ASCII 7 (BEL). (Spesso genera qualche tipo di segnale sonoro udibile.)

\b

Barra inversa, Ctrl-h, codice ASCII 8 (BS).

\f

Nuova pagina, Ctrl-l, codice ASCII 12 (FF).

\n

A-capo, Ctrl-j, codice ASCII 10 (LF).

\r

Ritorno-a-capo, Ctrl-m, codice ASCII 13 (CR).

\t

Tabulazione orizzontale, Ctrl-i, codice ASCII 9 (HT).

\v

Tabulazione verticale, Ctrl-k, codice ASCII 11 (VT).

\nnn

Il valore ottale nnn, dove nnn può essere da 1 a 3 cifre ottali, tra ‘0’ e ‘7’. Per esempio, il codice per il carattere ASCII ESC (escape) è ‘\033’.

\xhh

Il valore esadecimale hh, dove hh indica una sequenza di cifre esadecimali (‘0’–‘9’, e ‘A’–‘F’ o ‘a’–‘f’). Dopo ‘\x’ è consentito un massimo di due cifre. Ogni ulteriore cifra esadecimale è considerata come una semplice lettera o numero. (e.c.) (La sequenza di protezione ‘\x’ non è permessa in POSIX awk.)

ATTENZIONE: In ISO C, la sequenza di protezione continua fino a raggiungere il primo carattere che non sia una cifra esadecimale. In passato, gawk avrebbe continuato ad aggiungere cifre esadecimali al valore finché non trovava una cifra non esadecimale oppure fino a raggiungere la fine della stringa. Comunque usare più di due cifre esadecimali produceva risultati indefiniti. Dalla versione 4.2, vengono elaborate solo due cifre.

\/

Una barra (dovrebbe essere usata solo per costanti regexp). Questa sequenza si usa per inserire una costante regexp che contiene una barra (come /.*:\/home\/[[:alnum:]]+:.*/; la notazione ‘[[:alnum:]]’ verrà spiegata più avanti, in Usare espressioni tra parentesi quadre). Poiché una regexp è racchiusa tra barre, si deve proteggere ogni barra che sia parte dell’espressione, per dire ad awk di andare avanti a scandire il resto della regexp.

\"

Un doppio apice (dovrebbe essere usato solo per costanti stringa). Questa sequenza si usa per inserire in una costante stringa il carattere doppio apice (come "Egli le disse \"ciao!\"."). Poiché la stringa è racchiusa tra doppi apici, si deve proteggere ogni doppio apice che sia parte della stringa per dire ad awk di andare avanti a elaborare il resto della stringa.

In gawk, parecchie altre sequenze di due caratteri inizianti con con una barra inversa hanno un significato speciale nelle regexp. Operatori regexp propri di gawk.

In una regexp, una barra inversa che preceda un carattere non presente nella lista precedente, e non elencato in Operatori regexp propri di gawk, significa che il carattere seguente dovrebbe essere preso letteralmente, anche se normalmente sarebbe un operatore di regexp. Per esempio, /a\+b/ individua i tre caratteri ‘a+b’.

Per una completa portabilità, non usare una barra inversa prima di qualsiasi carattere non incluso nella lista precedente, o che non sia un operatore.

Barra inversa prima di un carattere normale

Se si mette una barra inversa in una costante stringa prima di qualcosa che non sia uno dei caratteri elencati sopra, POSIX awk di proposito lascia indefinito il comportamento. Ci sono due possibilità:

Togliere la barra inversa

Questo è quel che sia BWK awk che gawk fanno. Per esempio, "a\qc" equivale a "aqc". (Poiché questo è un errore che può capitare o non capitare con la stessa probabilità, gawk lo segnala). Volendo usare come separatore di campo ‘FS = "[ \t]+\|[ \t]+"’ ossia delle barre verticali precedute e seguite da almeno uno spazio, occorre mettere due barre inverse nella stringa: ‘FS = "[ \t]+\\|[ \t]+"’.)

Tenere la barra inversa così com’è.

Alcune altre implementazioni di awk fanno questo. In quelle implementazioni, immettere "a\qc" equivale a immettere "a\\qc".

Ricapitolando:

Sequenze di protezione per metacaratteri

Supponiamo che si usi una protezione ottale o esadecimale per rappresentare un metacarattere di regexp (si veda Operatori di espressioni regolari). awk considera il carattere come un carattere letterale o come un operatore di regexp?

Storicamente, tali caratteri erano considerati letteralmente. (a.b.) Invece, lo standard POSIX richiede che siano considerati come metacaratteri veri e propri, e questo è ciò che gawk fa. In modalità compatibile (vedi la sezione Opzioni sulla riga di comando), gawk tratta i caratteri scritti come sequenze ottali ed esadecimali letteramente, quando sono usati in costanti regexp. Quindi, /a\52b/ equivale a /a\*b/.


Successivo: , Precedente: , Su: Espressioni regolari   [Contenuti][Indice]