Come usare il comando Linux tr

Pubblicato: 2023-05-17
Schermata di avvio di Ubuntu Linux su un laptop
Jordan Gloor / How-To Geek
Il comando tr esegue trasformazioni su un flusso di testo, producendo un nuovo flusso come output. È possibile sostituire, eliminare o convertire i caratteri in base alle regole impostate nella riga di comando.

Hai bisogno di un metodo senza fronzoli per manipolare un flusso di testo in Linux? Non guardare oltre il comando tr, che può farti risparmiare tempo nella sostituzione, rimozione, combinazione e compressione del testo di input. Ecco come si fa.

Sommario

Qual è il comando tr?
Sostituzione dei caratteri
Utilizzo di intervalli e token
Invertire le corrispondenze
Eliminazione e compressione dei caratteri
Eliminazione di caratteri
Linee che uniscono e dividono
Usando tr Con Pipe
Semplice è come semplice fa

Qual è il comando tr?

Il comando Linux tr è un'utilità veloce e semplice per eliminare i caratteri indesiderati dai flussi di testo e per altri trucchi di manipolazione accurati. Prende il nome dalla parola "tradurre" e le radici di tr affondano nella tradizione Unix.

Come tutti sappiamo, Linux è una riscrittura open source di Unix. Aggiunge anche le sue cose al mix. Non è un clone byte per byte, ma prende chiaramente gran parte dei suoi principi di progettazione e guida ingegneristica dal sistema operativo Unix.

Sebbene finora solo due distribuzioni Linux siano state certificate come conformi a POSIX e ufficialmente accettate come implementazioni di Unix — EulerOS e Inspur K-UX — Linux ha quasi completamente soppiantato Unix nel mondo degli affari.

Tutte le distribuzioni Linux, almeno nelle loro utilità principali, aderiscono alla filosofia Unix. La filosofia Unix racchiude la visione che i pionieri di Unix avevano per il loro nuovo sistema operativo. Viene spesso parafrasato come "Scrivi programmi che fanno bene una cosa". Ma c'è di più.

Una delle innovazioni più potenti era che i programmi generassero un output che potesse essere utilizzato come input per altri programmi. La capacità di collegare a margherita le utilità della riga di comando insieme, utilizzando il flusso di output da un programma come flusso di input al programma successivo in linea, è estremamente potente.

A volte vorrai mettere a punto o modificare l'output di un programma prima che raggiunga il programma successivo in linea. O forse non stai prendendo il tuo input da uno strumento da riga di comando di Linux, stai trasmettendo testo da un file che non è stato creato pensando alle tue particolari esigenze.

È qui che entra in gioco tr . Ti consente di eseguire una serie di semplici trasformazioni sul suo flusso di input, per produrre il suo flusso di output. Quel flusso di output può essere reindirizzato in un file, inserito in un altro programma Linux o persino in un'altra istanza di tr per avere più trasformazioni applicate al flusso.

Sostituzione dei caratteri

Il comando tr opera sul suo flusso di input in base alle regole. Utilizzato senza alcuna opzione della riga di comando, l'azione predefinita di tr consiste nel sostituire i caratteri nel flusso di input con altri caratteri.

I comandi per tr di solito richiedono due gruppi di caratteri. Il primo set contiene i caratteri che verranno sostituiti se vengono trovati nel flusso di input. Il secondo set contiene i caratteri con cui verranno sostituiti.

Il modo in cui funziona è che le occorrenze del primo carattere nel primo set saranno sostituite dal primo carattere nel secondo set. Le occorrenze del secondo carattere nel primo set verranno sostituite dal secondo carattere nel secondo set e così via.

Questo esempio cercherà la lettera "c" nel flusso di input in tr e sostituirà ogni occorrenza con la lettera "z". Si noti che tr fa distinzione tra maiuscole e minuscole.

Stiamo usando echo per inserire del testo in tr .

 eco abcdefabc | tr 'c' 'z' 

Sostituendo un singolo carattere con tr

Tutte le occorrenze di "c" vengono sostituite con "z" e la nuova stringa viene scritta nella finestra del terminale.

Questa volta cercheremo due lettere, "a" e "c". Tieni presente che non stiamo cercando "ac". Cerchiamo "a", quindi cerchiamo "c". Sostituiremo qualsiasi occorrenza di "a" con "x" e qualsiasi occorrenza di "c" con "z".

 eco abcdefabc | tr 'ac' 'xz' 

Togliere due lettere con tr

Affinché funzioni, devi avere lo stesso numero di caratteri in entrambi i set. Se non lo fai, otterrai un comportamento prevedibile, ma probabilmente indesiderato.

 echo 'chiamami Ismaele.' | tr 'abcdjklm' '123' 

Utilizzo di set di caratteri sbilanciati con tr

Ci sono più personaggi nel primo set che nel secondo. Le lettere da "d" a "m" non hanno un carattere corrispondente nel secondo set. Verranno comunque sostituiti, ma saranno tutti sostituiti con l'ultimo personaggio del secondo set.

È quasi possibile che questo possa essere utile in alcuni casi, ma se vuoi impedirlo puoi usare l'opzione -t (tronca). Questo sostituisce solo quei caratteri contenuti nel set uno che hanno un carattere corrispondente nel set due.

 echo 'chiamami Ismaele.' | tr -t 'abcdjklm' '123' 

Utilizzo di set di caratteri sbilanciati con tr con l'opzione truncate

Utilizzo di intervalli e token

Il set uno e il set due possono contenere intervalli di caratteri. Ad esempio, [az] rappresenta tutte le lettere minuscole e [AZ] rappresenta tutte le lettere maiuscole. Possiamo usarlo per cambiare il caso di un flusso di testo.

Questo convertirà il flusso di input in maiuscolo.

 echo "How-To Geek" | tr '[az]' '[AZ]' 

Utilizzo di intervalli di caratteri per convertire una stringa in maiuscolo

Per capovolgere il caso nell'altra direzione, possiamo usare lo stesso comando ma con gli intervalli maiuscolo e minuscolo scambiati sulla riga di comando.

 echo "How-To Geek" | tr '[AZ]' '[az]' 

Utilizzo di intervalli di caratteri per convertire una stringa in lettere minuscole

Ci sono token che possiamo usare per alcuni dei casi comuni con cui potremmo voler abbinare.

  • [:alnum:] : Lettere e cifre.
  • [:alpha:] : Solo lettere.
  • [:digit:] : Solo cifre.
  • [:blank:] : tabulazioni e spazi.
  • [:space:] : tutti gli spazi bianchi, inclusi i caratteri di nuova riga.
  • [:graph:] : tutti i caratteri inclusi i simboli, ma non gli spazi.
  • [:print:] : tutti i caratteri inclusi i simboli, inclusi gli spazi.
  • [:punct:] : tutti i caratteri di punteggiatura.
  • [:lower:] : lettere minuscole.
  • [:upper:] : lettere maiuscole.

Possiamo eseguire le nostre conversioni da minuscolo a maiuscolo e da maiuscolo a minuscolo altrettanto facilmente, utilizzando i token.

 echo "How-To Geek" | tr '[:inferiore:]' '[:superiore:]'
 echo "How-To Geek" | tr '[:superiore:]' '[:inferiore:]' 

Utilizzo di token per modificare il caso di stringhe di testo

Invertire le corrispondenze

L'opzione -c (complemento) corrisponde a tutti i caratteri tranne quelli del primo set. Questo comando converte tutto tranne la lettera "c" in un trattino " - ".

 echo abcdefc | tr -c 'c' '-' 

Sostituzione di tutti i caratteri tranne quelli specificati con altri caratteri

Questo comando aggiunge la lettera "a" al primo set. Qualunque cosa tranne "a" o "c" viene convertita in un carattere trattino " - ".

 echo abcdefc | tr -c 'ac' '-' 

Sostituzione di tutti tranne i caratteri multipli specificati con altri caratteri

Eliminazione e compressione dei caratteri

Possiamo usare tr per rimuovere del tutto i caratteri, senza alcuna sostituzione.

Questo comando utilizza l'opzione -d (delete) per rimuovere qualsiasi occorrenza di "a", "d" o "f" dal flusso di input.

 echo abcdefc | tr -d 'adf' 

Cancellare più caratteri da una stringa di testo con tr

Questo è un caso in cui abbiamo solo un set di caratteri sulla riga di comando, non due.

Un altro è quando usiamo l'opzione -s (squeeze-repeates). Questa opzione riduce i caratteri ripetuti a un singolo carattere.

Questo esempio ridurrà le sequenze ripetute del carattere spazio a un singolo spazio.

 echo "abc de fc" | tr -s '[:vuoto:]' 

Modifica di sequenze ripetute di caratteri in una singola occorrenza del carattere, con tr

È un po' confuso il fatto che il token [:blank:] rappresenti il ​​carattere spazio, e il token [:space:] rappresenti tutte le forme di spazi bianchi, incluse tabulazioni e caratteri di nuova riga.

In questo caso, potremmo sostituire [:blank:] con [:space:] e ottenere lo stesso risultato.

 echo "abc de fc" | tr -s '[:spazio:]' 

Modifica di sequenze ripetute di caratteri in una singola occorrenza del carattere, con tr

Eliminazione di caratteri

Le differenze tra [:blank:] e [:space:] diventano evidenti quando cancelliamo i caratteri. Per fare ciò, usiamo l'opzione -d (delete) e forniamo un set di caratteri che tr cercherà nel suo flusso di input. Tutto ciò che trova viene rimosso.

 echo "abc de fc" | tr -d '[:vuoto:]' 

Eliminazione di spazi vuoti (caratteri spazio) da una stringa di testo, con tr

Gli spazi vengono cancellati. Si noti che otteniamo una nuova riga dopo che il flusso di output è stato scritto nella finestra del terminale. Se ripetiamo quel comando e usiamo [:space:] invece di vuoto, otterremo un risultato diverso.

 echo "abc de fc" | tr -d '[:vuoto:]' 

Cancellare gli spazi bianchi da una stringa di testo, con tr

Questa volta non iniziamo una nuova riga dopo l'output, il prompt dei comandi si scontra con essa. Questo perché [:space:] include le nuove righe. Eventuali spazi, tabulazioni e caratteri di nuova riga vengono rimossi dal flusso di input.

Ovviamente, potresti usare anche un vero carattere spaziale.

 echo "abc de fc" | tr -d ' ' 

Cancellazione di spazi da una stringa di testo, specificando un carattere di spazio, con tr

Possiamo altrettanto facilmente eliminare le cifre.

 eco abcd123efg | tr -d '[:cifra:]' 

Cancellare cifre da una stringa di testo con tr

Combinando le opzioni -c (complemento) e -d (cancella) possiamo cancellare tutto tranne le cifre.

 eco abcd123efg | tr -cd '[:cifra:]' 

Cancellare tutto tranne le cifre da una stringa di testo usando tr

Nota che tutto tranne le cifre significa tutte le lettere e tutti gli spazi bianchi, quindi ancora una volta perdiamo la nuova riga finale.

Linee che uniscono e dividono

Se sostituiamo gli spazi con i caratteri di nuova riga, possiamo dividere una riga di testo e posizionare ogni parola sulla propria riga.

 echo 'uno due tre quattro' | tr ' ' '\n' 

Dividere una riga di testo in una parola per riga, con tr

Possiamo cambiare anche il delimitatore che separa le parole. Questo comando sostituisce i due punti " : " per gli spazi.

 echo 'uno due tre quattro' | tr ' ' ':' 

Cambiare il delimitatore di parola da spazi a due punti, con tr

Possiamo trovare qualunque delimitatore sia in uso e sostituirlo con caratteri di nuova riga, suddividendo il testo difficile da leggere in un output più facile da gestire.

La variabile di ambiente path è una lunga stringa di molti percorsi di directory. I due punti " : " separano ogni percorso. Li cambieremo in caratteri di nuova riga.

 echo $PERCORSO
 echo $PERCORSO | tr ":" "\n" 

Suddivisione della variabile d'ambiente $PATH in percorsi di directory separati, uno per riga, con tr

È molto più facile da analizzare visivamente.

Se abbiamo un output che vogliamo riformattare in una singola riga, possiamo farlo anche noi. Il file "lines.txt" contiene del testo, con una parola su ogni riga. Lo inseriremo in tr e lo convertiremo in una singola riga.

 file cat.txt
 gatto linee.txt | tr '\n' ' ' 

Combinando l'input su più righe in una singola riga di testo, utilizzando tr

Usando tr Con Pipe

Possiamo usare l'output di tr come input per un altro programma, o anche per tr stesso.

Questo comando usa tr quattro volte.

  • Il primo tr elimina eventuali trattini "-" dall'input.
  • La seconda tr comprime tutti gli spazi ripetuti in spazi singoli.
  • La terza tr sostituisce gli spazi con caratteri di sottolineatura “_”.
  • Il quarto e ultimo tr converte la stringa in minuscolo.
 echo "Mangled File-nAMe.txt" | tr -d '-' | tr -s ' ' | tr ' '_' | tr '[:superiore:]' '[:inferiore:]' 

Una pipeline di quattro istanze di tr

CORRELATO: Come utilizzare Pipe su Linux

Semplice è come semplice fa

Il comando tr è fantastico perché è semplice. Non c'è molto da imparare né da ricordare. Ma la sua semplicità può essere anche la sua rovina.

Non commettere errori, spesso scoprirai che tr ti consente di fare ciò di cui hai bisogno senza dover ricorrere a strumenti più complicati come sed .

Come utilizzare il comando sed su Linux
CORRELATI Come utilizzare il comando sed su Linux

Tuttavia, se stai lottando per fare qualcosa con tr e ti ritrovi a creare lunghe catene di comandi a margherita, probabilmente dovresti usare sed .