<Precedenti | Contenuti | Succ.>
Alternanza
La prima delle funzionalità estese delle espressioni regolari di cui parleremo è chiamata alternanza, che è la struttura che consente di verificare una corrispondenza tra un insieme di espressioni. Proprio come un'espressione tra parentesi consente la corrispondenza di un singolo carattere da un insieme di caratteri specificati, l'alternanza consente le corrispondenze da un insieme di stringhe o altre espressioni regolari.
Per dimostrare, useremo grep insieme a eco. Per prima cosa, proviamo una semplice vecchia corrispondenza di stringhe:
[io@linuxbox~]$ echo "AAA" | grep AAA
AAA
[io@linuxbox~]$ echo "BBB" | grep AAA
[io@linuxbox~]$
[io@linuxbox~]$ echo "AAA" | grep AAA
AAA
[io@linuxbox~]$ echo "BBB" | grep AAA
[io@linuxbox~]$
Un esempio piuttosto semplice, in cui convogliamo l'output di eco ai miglioramenti grep e vedere i risultati. Quando si verifica una corrispondenza, la vediamo stampata; quando non si verifica alcuna corrispondenza, non vediamo risultati.
Ora aggiungeremo l'alternanza, indicata dal metacarattere della barra verticale:
[io@linuxbox~]$ echo "AAA" | grep -E 'AAA|BBB'
AAA
[io@linuxbox~]$ echo "BBB" | grep -E 'AAA|BBB'
BBB
[io@linuxbox~]$ echo "CCC" | grep -E 'AAA|BBB'
[io@linuxbox~]$
[io@linuxbox~]$ echo "AAA" | grep -E 'AAA|BBB'
AAA
[io@linuxbox~]$ echo "BBB" | grep -E 'AAA|BBB'
BBB
[io@linuxbox~]$ echo "CCC" | grep -E 'AAA|BBB'
[io@linuxbox~]$
Qui vediamo l'espressione regolare 'AAA|BBB', che significa "corrisponde alla stringa AAA o la stringa BBB.” Nota che poiché questa è una funzionalità estesa, abbiamo aggiunto il -E opzione a grep (anche se avremmo potuto semplicemente usare il egrep programma) e abbiamo racchiuso l'espressione regolare tra virgolette per impedire alla shell di interpretare il metacarattere della barra verticale come un operatore pipe. L'alternanza non è limitata a due scelte:
[io@linuxbox~]$ echo "AAA" | grep -E 'AAA|BBB|CCC'
AAA
[io@linuxbox~]$ echo "AAA" | grep -E 'AAA|BBB|CCC'
AAA
Per combinare l'alternanza con altri elementi dell'espressione regolare, possiamo usare () per separare l'alternanza:
[io@linuxbox~]$ grep -Eh '^(bz|gz|zip)' dirlist*.txt
[io@linuxbox~]$ grep -Eh '^(bz|gz|zip)' dirlist*.txt
Questa espressione corrisponderà ai nomi di file nei nostri elenchi che iniziano con "bz", "gz" o "zip". Se avessimo lasciato le parentesi, il significato di questa espressione regolare:
[io@linuxbox~]$ grep -Eh '^bz|gz|zip' dirlist*.txt
[io@linuxbox~]$ grep -Eh '^bz|gz|zip' dirlist*.txt
cambia in modo che corrisponda a qualsiasi nome di file che inizia con "bz" o contiene "gz" o contiene "cerniera lampo".