Come usare il comando Linux tr
Pubblicato: 2023-05-17Hai 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.
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'
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'
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'
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 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]'
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]'
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:]'
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' '-'
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' '-'
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'
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:]'
È 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:]'
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:]'
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:]'
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 ' '
Possiamo altrettanto facilmente eliminare le cifre.
eco abcd123efg | tr -d '[:cifra:]'
Combinando le opzioni -c
(complemento) e -d
(cancella) possiamo cancellare tutto tranne le cifre.
eco abcd123efg | tr -cd '[:cifra:]'
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'
Possiamo cambiare anche il delimitatore che separa le parole. Questo comando sostituisce i due punti " :
" per gli spazi.
echo 'uno due tre quattro' | 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"
È 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' ' '
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:]'
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
.
Tuttavia, se stai lottando per fare qualcosa con tr
e ti ritrovi a creare lunghe catene di comandi a margherita, probabilmente dovresti usare sed
.