tr
è un'utilità della riga di comando nei sistemi Linux e Unix che traduce, elimina e comprime i caratteri dallo standard input e scrive il risultato nello standard output.
Il tr
comando può eseguire operazioni come la rimozione di caratteri ripetuti, la conversione da maiuscolo a minuscolo e la sostituzione e la rimozione di caratteri di base. Tipicamente, viene utilizzato in combinazione con altri comandi tramite piping.
In questo tutorial, ti mostreremo come utilizzare il tr
comando attraverso esempi pratici e spiegazioni dettagliate delle opzioni più comuni.
Come usare il tr
Comando #
La sintassi per tr
il comando è il seguente:
tr OPTION... SET1 [SET2]
tr
accetta due set di caratteri, generalmente della stessa lunghezza, e sostituisce i caratteri del primo set con i caratteri corrispondenti del secondo set.
Un SET
è fondamentalmente una stringa di caratteri, inclusi i caratteri speciali con escape barra rovesciata.
Nell'esempio seguente, tr
sostituirà tutti i caratteri dello standard input (linuxize), mappando i caratteri del primo set con quelli corrispondenti del secondo set.
echo 'linuxize' | tr 'lin' 'red'
Ogni occorrenza di l
viene sostituito con r
, i
con e
e n
con d
:
reduxeze
I set di caratteri possono essere definiti anche utilizzando intervalli di caratteri. Ad esempio, invece di scrivere:
echo 'linuxize' | tr 'lmno' 'wxyz'
puoi usare:
echo 'linuxize' | tr 'l-n' 'w-z'
Quando -c
(--complement
) viene utilizzata l'opzione tr
sostituisce tutti i caratteri che non sono in SET1.
Nell'esempio seguente tutti i caratteri tranne "li" verranno sostituiti con l'ultimo carattere del secondo set:
echo 'linuxize' | tr -c 'li' 'xy'
liyyyiyyy
Come avrai notato, l'output sopra ha un carattere più visibile rispetto all'input. Questo perché echo
comando stampa un carattere di nuova riga invisibile \n
che viene anche sostituito con y
. Per fare eco a una stringa senza una nuova riga, usa -n
opzione.
Il -d
(--delete
) l'opzione dice a tr
per eliminare i caratteri specificati in SET1. Quando si eliminano i caratteri senza schiacciarli, specificare un solo set.
Il comando seguente rimuoverà l
, i
e z
caratteri:
echo 'Linuxize' | tr -d 'liz'
La L
il carattere non viene eliminato perché l'input include una L
maiuscola mentre il l
carattere nel SET è minuscolo.
Lnuxe
Il -s
(--squeeze-repeats
) l'opzione sostituisce una sequenza di occorrenze ripetute con il set di caratteri nell'ultimo SET.
Nell'esempio seguente, tr
rimuove gli spazi ripetuti:
echo "GNU \ Linux" | tr -s ' '
GNU \ Linux
Quando si utilizza SET2, la sequenza dei caratteri specificata in SET1 viene sostituita con SET2.
echo "GNU \ Linux" | tr -s ' ' '_'
GNU_\_Linux
Il -t
(--truncate-set1
) l'opzione forza tr
per 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 'Linux ize' | tr 'abcde' '12'
L'output mostra che il carattere e
da SET1 è abbinato all'ultimo carattere di SET2, che è 2
:
Linux iz2
Ora usa lo stesso comando con -t
opzione:
echo 'Linux ize' | tr -t 'abcde' '12'
Linux ize
Puoi vedere che gli ultimi tre caratteri di SET1 vengono rimossi. SET1 diventa 'ab', la stessa lunghezza di SET2 e non viene effettuata alcuna sostituzione.
Opzioni combinate #
Il tr
comando ti consente anche di combinare le sue opzioni. Ad esempio, il comando seguente sostituisce prima tutti i caratteri tranne i
con 0
e poi spreme il ripetuto 0
caratteri:
echo 'Linux ize' | tr -cs 'i' '0'
0i0i0
Esempi di comando Tr #
In questa sezione tratteremo alcuni esempi di usi comuni di tr
comando.
Converti da minuscolo a maiuscolo #
La conversione da minuscolo a maiuscolo o viceversa è uno dei casi d'uso tipici di tr
comando. [:lower:]
corrisponde a tutti i caratteri minuscoli e [:upper:]
corrisponde a tutti i caratteri maiuscoli.
echo 'Linuxize' | tr '[:lower:]' '[:upper:]'
LINUXIZE
Invece delle classi di caratteri, puoi anche utilizzare intervalli:
echo 'Linuxize' | tr 'a-z' 'A-Z'
Per convertire le maiuscole in minuscole, cambia semplicemente le posizioni dei set.
Rimuovi tutti i caratteri non numerici #
Il comando seguente rimuove tutti i caratteri non numerici:
echo "my phone is 123-456-7890" | tr -cd [:digit:]
[:digit:]
sta per tutti i caratteri numerici e usando il -c
opzione, il comando rimuove tutti i caratteri non numerici. L'output sarà simile a questo:
1234567890
Inserisci ogni parola in una nuova riga #
Per inserire ogni parola in una nuova riga, dobbiamo abbinare tutti i caratteri non alfanumerici e sostituirli con una nuova riga:
echo 'GNU is an operating system' | tr -cs '[:alnum:]' '\n'
GNU
is
an
operating
system
Rimuovi le righe vuote #
Per eliminare le righe vuote è sufficiente comprimere i caratteri di nuova riga ripetitivi:
tr -s '\n' < file.txt > new_file.txt
Nel comando sopra stiamo usando il simbolo di reindirizzamento <
per passare il contenuto del file.txt
al tr
comando. Il reindirizzamento >
scrive l'output del comando in new_file.txt
.
Stampa $PATH
directory su una riga separata #
Il $PATH
La variabile ambientale è un elenco di directory delimitato da due punti che indica alla shell quali directory cercare i file eseguibili quando si digita un comando.
Per stampare ogni directory su una riga separata dobbiamo far corrispondere i due punti (:
) e sostituirlo con la nuova riga:
echo $PATH | tr ':' '\n'
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
Conclusione #
tr
è un comando per tradurre o eliminare caratteri.
Sebbene molto utile, tr
può funzionare solo con singoli caratteri. Per corrispondenze di modelli e manipolazioni di stringhe più complesse, dovresti usare sed
o awk
.
Se hai domande o feedback, sentiti libero di lasciare un commento.