Caratteri Jolly
Servono ad identificare più di un file nei comandi shell.
?
sostituisce un singolo carattere nella posizione corrente*
sostituisce un numero qualsiasi di caratteri, anche zero, nella posizione corrente[ ]
racchiudono un numero di carartteri da cui ne viene selezionato uno solo[12af]
– un insieme di caratteri[a-m]
– un range di caratteri, inclusi i capi, in ordine ASCII crescente[^ ]
seleziona un carattere non presente tra le parentesi quadre
Non confondere i Caratteri Jolly con le Espressioni Regolari
Esempi
cp *.txt sub1
mv chapter??.doc backup
rm *.o
Attenzione!!
$ rm * .o
$ .o: not found
Il seguente comando non è possibile:
mv *.txt *.doc
Procedura shell per ottenere lo stesso effetto:
for i in *.txt
do
j=`basename $i .txt`
mv $i $j.doc
done
I caratteri jolly vengono espansi dalla shell PRIMA dell'esecuzione del comando.
Esempi
Espressioni Regolari
.
- un qualsiasi caratterea+
- una “a”a?
- zero o una “a”a*
- zero o più “a”(ab)*
- zero o più “ab”^a
- “a” a inizio rigaa$
- “a” a fine riga[ab]
- il carattere “a” oppure “b”[^ab]
- nè “a” nè “b”(uno|due)
- la stringa “uno” oppure “due”
Sono usate dal comando grep
, che viene in tre versioni:
grep
- riconosce parte delle ER, velocità mediafgrep
- riconosce poche ER, velocità altaegrep
- riconosce tutte le ER, velocità bassa
Le espressioni regolari costituiscono una sintassi complicata
Vi sono purtroppo più motori di espressioni regolari
POSIX
- standard ormai anzianoGRE
- Gnu Regular ExpressionsPCRE
- Perl Compatible Regular Expressions- ecc.
Comandi diversi usano motori diversi e hanno diverse capacità di riconoscimento
perl
- (Pattern Extraction and Report Language) è il più completoawk
- anch'esso molto completo
Esempi di Espressioni Regolari
Il nuovo comando rename
Linux in alcune distribuzioni nuove ha introdotto il comando rename
, che permette di cambiare parte del nome di un numero di files, identificati da caratteri jolly, tramite una specifica basata su espressioni regolari.
La sintassi di questo comando è:
rename [opzioni] s/regexvecchio/regexnuovo/ patternjolly
ove:
s/.../.../
indica sostituzioneregexveccho
è l'espressione regolare che denota componenti del nome dei file esistentiregexnuovo
è l'espressione regolare che denotaa i nuovi componenti dei filepatternjolly
è un'espressione basata sui caratteri jolly che indica a quali files applicare i cambiamenti
Esempio:
rename s/\.txt/\.doc/ *.txt
Ci vuole\.
e non solo.
perchè quest'ultimo è un metacarattere delle espressioni regolari
Le opzioni sono:
-v
- verboso-n
- non eseguire veramente (modalità test)-f
- forza la sovrascrittura di eventuali files preesistenti
C'è anche la modalità traduzione, oltre quella sostituzione.Per esempio:
rename y/A-Z/a-z/ *
cambia tutti i nomi dei files da maiuscole a minuscole.