Introduzione

Tr è un'utilità della riga di comando nei sistemi Linux e Unix che traduce, elimina e comprime i caratteri dall'input standard e scrive il risultato nell'output standard.

Il comando tr viene solitamente utilizzato in combinazione con altri comandi tramite piping e può eseguire operazioni come la rimozione di caratteri ripetuti, la conversione di lettere maiuscole in minuscole e la sostituzione e la rimozione di caratteri di base.

In questo tutorial, ti mostreremo come utilizzare il comando tr attraverso esempi pratici e spiegazioni dettagliate delle opzioni più comuni.

Come usare il comando Tr

La sintassi per il comando tr è la seguente:

tr OPTION... SET1 [SET2]

tr accetta due set di caratteri, in genere con la stessa lunghezza e sostituisce i caratteri dei primi set con i caratteri corrispondenti del secondo set.

Un SET è fondamentalmente una serie di caratteri inclusi gli speciali caratteri con escape backslash.

Nel seguente esempio, tr sostituirà tutti i caratteri dall'input noviello mappando i caratteri del primo set con quelli corrispondenti del secondo set.

echo 'noviello' | tr 'nov' 'red'

tr sostituirà ogni occorrenza di n con r, o con e e v con d.

L'output sarà simile al seguente:

redielle

I set di caratteri possono anche essere definiti utilizzando intervalli di caratteri. Ad esempio invece di scrivere:

echo 'noviello' | tr 'nvl' 'xyz'
xoyiezzo

Puoi usare:

echo 'noviello' | tr 'l-n' 'w-z'
yoviewwo

Quando viene utilizzata l'opzione -c( --complement) tr sostituirà tutti i caratteri che non si trovano in SET1.

Nell'esempio seguente tutti i caratteri che non sono in SET1 verranno sostituiti con l'ultimo carattere di SET2:

echo 'noviello' | tr -c 'no' 'xy'

Come avrai notato, l'output ha un carattere più visibile dell'input. Questo perché il comando echo stampa un carattere invisibile \n (nuova riga) che viene anche sostituito con y. Per eseguire l'eco di una stringa senza una nuova riga, utilizzare l'opzione -n.

noyyyyyoy

L' opzione -d( --delete) permette di eliminare i caratteri specificati in SET1.

Il comando seguente eliminerà tutti i caratteri specificati in SET1. Quando si eliminano i caratteri senza comprimere è possibile specificare solo un set.

echo 'noviello' | tr -d 'nol'

Il carattere L non verrà eliminato perché l'input include una lettera maiuscola L mentre il carattere l nel set in minuscolo.

vie

L' opzione -s( --squeeze-repeats) sostituisce una sequenza di ricorrenze ripetute con il set di caratteri nell'ultimo SET. Nell'esempio seguente verranno rimossi i caratteri di spazio ripetuto:

echo "GNU     \    Linux" | tr -s ' '
GNU \ Linux

Quando si utilizza SET2, la sequenza del carattere specificato in SET1 viene sostituita con SET2.

echo "GNU     \    Linux" | tr -s ' ' '_'
GNU_\_Linux

L' opzione -t( --truncate-set1) impone di troncare SET1 alla lunghezza di SET2 prima di eseguire ulteriori elaborazioni.

Per impostazione predefinita, se SET1 è maggiore di SET2  tr riutilizzerà l'ultimo carattere di SET2. Ecco un esempio:

echo 'novi ello' | tr 'abcde' '12'

L'output mostrerà che il carattere e di SET1 è abbinato all'ultimo carattere di SET2, che è 2:

novi 2llo

Ora usa lo stesso comando con l' opzione -t:

echo 'novi ello' | tr -t 'abcde' '12'

Si può vedere che in questo caso gli ultimi tre caratteri di SET1 vengono rimossi. SET1 diventa 'ab', la stessa lunghezza di SET2.

novi ello

Combinazione di opzioni

Il comando tr consente anche di combinare le sue opzioni. Ad esempio, il comando seguente sostituirà tutti i caratteri tranne i con 0 e quindi comprimerà i caratteri 0 ripetuti :

echo 'novi ello' | tr -cs 'i' '0'
0i0

Converti lettere minuscole in maiuscole

La conversione di lettere minuscole in maiuscole o inverse è uno dei casi d'uso tipici del comando tr. [:lower:] corrisponde a tutti i caratteri minuscoli e [:upper:] corrisponde a tutti i caratteri maiuscoli.

echo 'Noviello' | tr '[:lower:]' '[:upper:]'
NOVIELLO

Invece di classi di caratteri, puoi anche usare intervalli:

echo 'Noviello' | tr 'a-z' 'A-Z'

Per convertire maiuscole in minuscole è sufficiente cambiare la posizione dei set, quindi:

echo 'Noviello' | tr '[:upper:]' '[:lower:]'
noviello

Rimuovi tutti i caratteri non numerici

L'esempio seguente rimuoverà tutti i caratteri non numerici dall'input al comando tr:

echo "numero 123-456-789" | tr -cd [:digit:]

[:digit:] sta per tutti i caratteri delle cifre e usando l'opzione -c il comando rimuove tutti i caratteri non cifre. L'output sarà simile al seguente:

123456789

Metti ogni parola in una nuova riga

Per mettere ogni parola in una nuova riga dobbiamo abbinare tutti i caratteri non alfanumerici e sostituirli con una nuova riga:

echo 'Coding is my cardio,' | tr -cs '[:alnum:]' '\n'

Dovresti ricevere un messaggio di output simile al seguente:

Coding
is
my
cardio

Rimuovi le righe vuote

Per eliminare le righe vuote è sufficiente premere i caratteri ripetitivi della nuova riga:

tr -s '\n' <  mylog.txt > new_file.txt

Nel comando sopra stiamo usando il simbolo di reindirizzamento < per passare il contenuto del comando mylog.txt al comando tr come input. Il reindirizzamento > scrive l'output del comando su new_file.txt.

Stampa le $PATH directory su una riga separata

La  variabile ambientale $PATH è un elenco di directory delimitato da due punti che indica alla shell in quali directory cercare i file eseguibili quando si digita un comando.

Per stampare ogni directory su una riga separata dobbiamo abbinare i due punti (:) e sostituirlo con la nuova riga:

echo $PATH | tr  ':' '\n'

Dovresti ricevere un messaggio di output simile al seguente:

/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
...

Conclusione

Ormai dovresti avere una buona conoscenza di come usare il comando tr su Linux.