Il comando ‘tr’

Dite la verità, quanti di voi hanno mai usato il comando tr, o hanno mai saputo dell’esistenza di un simile comando? Io, ad essere sincero, non ne ho mai fatto uso, anche perché le funzioni che questo comando realizza le ho sempre trovate necessarie all’interno di programmi/applicazioni più complesse che io stesso scrivevo, per cui mi avvalevo delle opportune funzioni di libreria. Ma cosa fa il comando tr? E’ presto detto:

NAME
       tr - translate or delete characters

SYNOPSIS
       tr [OPTION]... SET1 [SET2]

Quindi il comando tr serve a tradurre caratteri (da un set ad un altro) all’interno di un testo oppure a cancellare un certo set di caratteri, sempre da un testo passato in ingresso. Ma non solo: questo comando consente, con l’opzione --squeeze-repeat, di rimuovere occorrenze multiple di uno stesso carattere.

Sebbene non sia necessario che il primo ed il secondo set siano della stessa dimensione, è preferibile che lo siano in modo da evitare comportamenti anomali.

Per spiegare meglio come funziona questo comando, farò qualche esempio prendendo come riferimento il seguente testo contenuto all’interno di un file che chiamiamo manzoni.txt:

“Quel ramo del lago di Como,
che volge a mezzogiorno,
tra due catene non interrotte di monti,
tutto a seni e a golfi, a seconda dello sporgere e del rientrare di quelli,
vien, quasi a un tratto, a ristringersi,
e a prender corso e figura di fiume…”

Se dal testo precedente vogliamo rimuovere tutte le vocali, possiamo usare il comando tr nel seguente modo:

cat manzoni.txt | tr -d [AEIOUaeiou]

Il risultato sarà questo:

“Ql rm dl lg d Cm,
ch vlg mzzgrn,
tr d ctn nn ntrrtt d mnt,
ttt sn glf, scnd dll sprgr dl rntrr d qll,
vn, qs n trtt, rstrngrs,
prndr crs fgr d fm…”

L’opzione -d è quella che specifica di cancellare i caratteri specificati nel set, all’interno del quale abbiamo avuto cura di elencare le vocali sia in minuscolo che in maiuscolo. Lo stesso risultato lo avremmo ottenuto con:

tr -d [AEIOUaeiou] < manzoni.txt

usando l’operatore di redirezione dell’input.

Se invece vogliamo convertire tutto il testo in maiuscolo, abbiamo due diverse soluzioni. La prima prevede di specificare i due set in maniera esplicita come intervallo di lettere:

cat manzoni.txt | tr [a-z] [A-Z]

La seconda prevede l’uso di opportuni specificatori:

cat manzoni.txt | tr [:lower:] [:upper:]

In entrambi i casi il risultato è il seguente:

“QUEL RAMO DEL LAGO DI COMO,
CHE VOLGE A MEZZOGIORNO,
TRA DUE CATENE NON INTERROTTE DI MONTI,
TUTTO A SENI E A GOLFI, A SECONDA DELLO SPORGERE E DEL RIENTRARE DI QUELLI,
VIEN, QUASI A UN TRATTO, A RISTRINGERSI,
E A PRENDER CORSO E FIGURA DI FIUME…”

Esattamente come [:lower:] ed [:upper:], con tr è possibile specificare altri set con altrettanti specificatori, per i quali vi rimando alla pagina di manuale.

Altro esempio di utilizzo di questo comando è il seguente:

cat manzoni.txt | tr [ioeas] [10345]

con cui convertiamo alcune lettere con diverse cifre, ottenendo:

“Qu3l r4m0 d3l l4g0 d1 C0m0,
ch3 v0lg3 4 m3zz0g10rn0,
tr4 du3 c4t3n3 n0n 1nt3rr0tt3 d1 m0nt1,
tutt0 4 53n1 3 4 g0lf1, 4 53c0nd4 d3ll0 5p0rg3r3 3 d3l r13ntr4r3 d1 qu3ll1,
v13n, qu451 4 un tr4tt0, 4 r15tr1ng3r51,
3 4 pr3nd3r c0r50 3 f1gur4 d1 f1um3…”

Un set può anche essere specificato come “complemento” (opzione -c) per indicare tutto ciò che non rientra nell’insieme stesso. Ad esempio, per cancellare da un testo tutti i caratteri che non sono caratteri alfabetici, possiamo usare:

cat manzoni.txt | tr -d -c [:alpha:]

ottenendo una sequenza di caratteri da cui sono stati rimossi spazi, punteggiatura e tutto ciò che non appartiene all’insieme delle lettere (maiuscole o minuscole):

QuelramodellagodiComochevolgeamezzogiornotraduecatenenoninterrottedimontituttoasenieagolfiasecondadellosporgereedelrientrarediquellivienquasiauntrattoaristringersieaprendercorsoefiguradifium

Quelli illustrati sono soltanto alcuni dei casi d’uso del comando tr, che può tornare utile in molte occasioni senza la necessità di scriversi la propria utility ad hoc.

Leave a Reply

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.