Guida avanzata di scripting Bash: Un'approfondita esplorazione dell'arte dello scripting di shell | ||
---|---|---|
Indietro | Avanti |
. . . the intellectual activity associated with software development is largely one of gaining insight. | |
Stowe Boyd |
Per sfruttare pienamente la potenza dello scripting di shell, occorre conoscere a fondo le Espressioni Regolari. Alcune utility e comandi comunemente impiegati negli script, come grep, expr, sed e awk, interpretano ed usano le ER.
Un'espressione è una stringa di caratteri. Quei caratteri la cui interpretazione va al di là del loro significato letterale vengono chiamati metacaratteri. Le virgolette, ad esempio, possono indicare la frase di una persona in un dialogo, idem o il meta-significato dei simboli che le seguono. Le Espressioni Regolari sono serie di caratteri e/o metacaratteri che verificano (o specificano) dei modelli.
Un'Espressione Regolare è formata da:
Una sequenza di caratteri. Sequenza da interpretare nel suo significato letterale. Il tipo più semplice di Espressione Regolare consiste solo di una serie di caratteri senza alcun metacarattere.
Àncore. Indicano (àncorano) la posizione, nella riga di testo, che l'ER deve verificare. Ad esempio, ^ e $ sono àncore.
Modificatori. Espandono o restringono (modificano) la dimensione del testo che l'ER deve verificare. Sono modificatori l'asterisco, le parentesi quadre e la barra inversa.
Le Espressioni Regolari (ER) vengono principalmente impiegate nelle ricerche di un testo e nella manipolazione di stringhe. Una ER verifica un singolo carattere o una serie di caratteri -- una sottostringa o una stringa intera.
L'asterisco -- * -- verifica un numero qualsiasi di ripetizioni della stringa di caratteri o l'ER che lo precede, compreso nessun carattere.
"1133*" verifica 11 + uno o più 3 + altri possibili caratteri: 113, 1133, 111312, eccetera.
Il punto -- . -- verifica un carattere qualsiasi , tranne il ritorno a capo. [1]
"13." verifica 13 + almeno un carattere qualsiasi (compreso lo spazio): 1133, 11333, ma non il solo 13.
L'accento circonflesso -- ^ -- verifica l'inizio di una riga, ma talvolta, secondo il contesto, nega il significato della serie di caratteri in una ER.
Il simbolo del dollaro -- $ -- alla fine di una ER verifica la fine di una riga.
"XXX$" verifica XXX alla fine di una riga.
"^$" verifica le righe vuote.
Le parentesi quadre -- [...] -- racchiudono una serie di caratteri da verificare in una singola ER.
"[xyz]" verifica i caratteri x, y o z.
"[c-n]" verifica tutti i caratteri compresi nell'intervallo da c a n.
"[B-Pk-y]" verifica tutti i caratteri compresi negli intervalli da B a P e da k a y.
"[a-z0-9]" verifica tutte le lettere minuscole o tutte le cifre.
"[^b-d]" verifica tutti i caratteri tranne quelli compresi nell'intervallo da b a d. Questo è un esempio di ^ che nega, o inverte, il significato della ER che segue (assumendo un ruolo simile a ! in un contesto diverso).
Sequenze combinate di caratteri racchiusi tra parentesi quadre verificano le possibili modalità di scrittura di una parola. "[Yy][Ee][Ss]" verifica yes, Yes, YES, yEs e così via. "[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]" verifica il numero di Previdenza Sociale. (negli U.S.A [N.d.T.]).
La barra inversa -- \ -- è il carattere di escape per un carattere speciale, il che significa che quel carattere verrà interpretato letteralmente.
"\$" riporta il simbolo del "$" al suo significato letterale, invece che a quello di fine riga in una ER. Allo stesso modo "\\" assume il significato letterale di "\".
"Parentesi acute" con escaping -- \<...\> -- indicano l'inizio e la fine di una parola.
Le parentesi acute vanno usate con l'escaping perché, altrimenti, avrebbero il loro significato letterale.
"\<tre\>" verifica la parola "tre", ma non "treno", "otre", "strega", ecc.
bash$ cat filetesto Questa è la riga 1, che è unica. Questa è l'unica riga 2. Questa è la riga 3, un'altra riga. Questa è la riga 4. bash$ grep 'un' filetesto Questa è la riga 1, che è unica. Questa è l'unica riga 2. Questa è la riga 3, un'altra riga. bash$ grep '\<un\>' filetesto Questa è la riga 3, un'altra riga. |
Il punto interrogativo -- ? -- verifica uno o nessun carattere dell'ER che lo precede. Viene generalmente usato per verificare singoli caratteri.
Il più -- + -- verifica uno o più caratteri della ER che lo precede. Svolge un ruolo simile all'*, ma non verifica l'occorrenza zero (nessuna occorrenza).
# La versione GNU di sed e awk può usare "+", # ma è necessario l'escaping. echo a111b | sed -ne '/a1\+b/p' echo a111b | grep 'a1\+b' echo a111b | gawk '/a1+b/' # Tutte queste forme si equivalgono. # Grazie, S.C. |
"Parentesi graffe" con escaping -- \{\} -- indicano il numero di occorrenze da verificare nella ER che le precede.
L'escaping delle parentesi graffe è necessario perché, altrimenti, avrebbero semplicemente il loro significato letterale. Quest'uso, tecnicamente, non fa parte della serie di ER di base.
"[0-9]\{5\}" verifica esattamente cinque cifre (nell'intervallo da 0 a 9).
Le parentesi graffe non sono disponibili come ER
nella versione "classica" (non-POSIX
compliant) di awk. Comunque,
gawk possiede l'opzione
Perl ed alcune versioni di egrep non richiedono l'escaping delle parentesi graffe. |
Parentesi -- ( ) -- racchiudono gruppi di ER. Sono utili seguite dall'operatore "|" e nelle estrazioni di sottostringa che usano expr.
-- | -- l'operatore "or" delle ER verifica una serie qualsiasi di caratteri alternativi.
bash$ egrep '(l|r)egge' misc.txt La persona che legge sembra essere meglio informata di chi non lo fa. Il re saggio regge il proprio regno con giustizia. |
Alcune versioni di sed, ed e ex supportano le versioni con escaping delle Espressioni Regolari estese descritte prima allo stesso modo delle utility GNU |
Rappresentano un metodo alternativo per specificare un intervallo di caratteri da verificare.
[:alnum:] verifica i caratteri alfabetici e/o numerici. Equivale a A-Za-z0-9.
[:alpha:] verifica i caratteri alfabetici. Equivale a A-Za-z.
[:blank:] verifica uno spazio o un carattere di tabulazione.
[:cntrl:] verifica i caratteri di controllo.
[:digit:] verifica le cifre (decimali). Equivale a 0-9.
[:graph:] (caratteri grafici stampabili). Verifica i caratteri nell'intervallo 33 - 126 della codifica ASCII. È uguale a [:print:], vedi oltre, ma esclude il carattere di spazio.
[:lower:] verifica i caratteri alfabetici minuscoli. Equivale a a-z.
[:print:] (caratteri stampabili). Verifica i caratteri nell'intervallo 32 - 126 della codifica ASCII. È uguale a [:graph:], visto prima, ma con l'aggiunta del carattere di spazio.
[:space:] verifica i caratteri di spaziatura (spazio e tabulazione orizzontale).
[:upper:] verifica i caratteri alfabetici maiuscoli. Equivale a A-Z.
[:xdigit:] verifica le cifre esadecimali. Equivale a 0-9A-Fa-f.
Le classi di caratteri POSIX generalmente richiedono il quoting o le doppie parentesi quadre ([[ ]]).
Queste classi di caratteri possono anche essere usate con il globbing, sebbene limitatamente.
Per vedere le classi di caratteri POSIX negli script, si faccia riferimento a Esempio 15-18 e Esempio 15-19. |
Sed, awk e Perl, usati come filtri negli script, trattano le ER come argomenti, quando devono "vagliare" o trasformare file o flussi di I/O. Vedi Esempio A-12 e Esempio A-17 per una descrizione di questa funzionalità.
Il riferimento fondamentale per questo complesso argomento è Mastering Regular Expressions di Friedl. Anche Sed & Awk, di Dougherty e Robbins fornisce una lucidissima trattazione delle ER. Vedi Bibliografia per ulteriori informazioni su questi libri.
[1] | Poiché sed, awk e grep elaborano le righe, di solito non dovrebbe presentarsi la necessità di verificare un ritorno a capo. In quei casi in cui dovesse esserci un ritorno a capo, perché inserito in una espressione su più righe, il punto lo verifica.
|