Como usar o comando tr do Linux
Publicados: 2023-05-17Você precisa de um método simples para manipular um fluxo de texto no Linux? Não procure mais do que o comando tr, que pode economizar tempo na substituição, remoção, combinação e compactação do texto de entrada. Assim que se faz.
O que é o comando tr?
Substituindo caracteres
Usando intervalos e tokens
Invertendo as Partidas
Excluindo e espremendo caracteres
Excluindo caracteres
Combinando e Dividindo Linhas
Usando tr com tubos
Simples é tão simples quanto
O que é o comando tr?
O comando tr
do Linux é um utilitário rápido e simples para remover caracteres indesejados de fluxos de texto e para outros truques de manipulação. Ele recebe o nome da palavra “traduzir” e as raízes de tr
são profundas na tradição do Unix.
Como todos sabemos, o Linux é uma reescrita de código aberto do Unix. Ele adiciona seu próprio material à mistura também. Ele não é um clone byte por byte, mas claramente leva muito de seus princípios de design e direção de engenharia do sistema operacional Unix.
Embora até agora apenas duas distribuições Linux tenham sido certificadas como compatíveis com POSIX e oficialmente aceitas como implementações do Unix - EulerOS e Inspur K-UX - o Linux suplantou quase completamente o Unix no mundo dos negócios.
Todas as distribuições Linux, pelo menos em seus principais utilitários, aderem à filosofia Unix. A filosofia Unix encapsula a visão que os pioneiros Unix tiveram para seu novo sistema operacional. Muitas vezes, é parafraseado como sendo “Escreva programas que fazem bem uma coisa”. Mas há mais do que isso.
Uma das inovações mais poderosas foi que os programas devem gerar resultados que possam ser usados como insumos para outros programas. A capacidade de encadear utilitários de linha de comando juntos, usando o fluxo de saída de um programa como o fluxo de entrada para o próximo programa na linha, é extremamente poderosa.
Às vezes, você desejará ajustar ou ajustar a saída de um programa antes que chegue ao próximo programa na linha. Ou talvez você não esteja recebendo sua entrada de uma ferramenta de linha de comando do Linux, você está transmitindo texto de um arquivo que não foi criado com suas necessidades específicas em mente.
É aqui que tr
entra em ação. Ele permite que você execute um conjunto de transformações simples em seu fluxo de entrada para produzir seu fluxo de saída. Esse fluxo de saída pode ser redirecionado para um arquivo, alimentado em outro programa Linux ou até mesmo em outra instância do tr
para ter várias transformações aplicadas ao fluxo.
Substituindo caracteres
O comando tr
opera em seu fluxo de entrada de acordo com as regras. Usado sem nenhuma opção de linha de comando, a ação padrão de tr
é substituir caracteres no fluxo de entrada por outros caracteres.
Comandos para tr
geralmente requerem dois conjuntos de caracteres. O primeiro conjunto contém os caracteres que serão substituídos se forem encontrados no fluxo de entrada. O segundo conjunto contém os caracteres pelos quais eles serão substituídos.
A maneira como isso funciona é que as ocorrências do primeiro caractere no conjunto um serão substituídas pelo primeiro caractere no conjunto dois. As ocorrências do segundo caractere no conjunto um serão substituídas pelo segundo caractere no conjunto dois e assim por diante.
Este exemplo procurará a letra “c” no fluxo de entrada para tr
e substituirá cada ocorrência pela letra “z”. Observe que tr
diferencia maiúsculas de minúsculas.
Estamos usando echo
para inserir algum texto em tr
.
eco abcdefabc | tr 'c' 'z'
Todas as ocorrências de “c” são substituídas por “z” e a nova string é gravada na janela do terminal.
Desta vez, procuraremos duas letras, “a” e “c”. Observe que não estamos procurando por "ac". Estamos procurando por "a" e, em seguida, procurando por "c". Vamos substituir qualquer ocorrência de “a” por “x” e qualquer ocorrência de “c” por “z”.
eco abcdefabc | tr 'ac' 'xz'
Para que isso funcione, você deve ter o mesmo número de caracteres em ambos os conjuntos. Caso contrário, você terá um comportamento previsível, mas provavelmente indesejado.
echo 'me chame de Ismael.' | tr 'abcdjklm' '123'
Há mais personagens no conjunto um do que no conjunto dois. As letras “d” a “m” não têm nenhum caractere correspondente no conjunto dois. Eles ainda serão substituídos, mas todos serão substituídos pelo último caractere do conjunto dois.
É quase possível que isso seja útil em alguns casos, mas se você quiser evitar isso, pode usar a opção -t
(truncate). Isso substitui apenas os caracteres contidos no conjunto um que possuem um caractere correspondente no conjunto dois.
echo 'me chame de Ismael.' | tr -t 'abcdjklm' '123'
Usando intervalos e tokens
O conjunto um e o conjunto dois podem conter intervalos de caracteres. Por exemplo, [az]
representa todas as letras minúsculas e [AZ]
representa todas as letras maiúsculas. Podemos fazer uso disso para alterar o caso de um fluxo de texto.
Isso converterá o fluxo de entrada em letras maiúsculas.
echo "How-To Geek" | tr '[az]' '[AZ]'
Para inverter o caso em outra direção, podemos usar o mesmo comando, mas com os intervalos de maiúsculas e minúsculas trocados na linha de comando.
echo "How-To Geek" | tr '[AZ]' '[az]'
Existem tokens que podemos usar para alguns dos casos comuns que podemos querer combinar.
- [:alnum:] : Letras e dígitos.
- [:alpha:] : Somente letras.
- [:digit:] : Somente dígitos.
- [:blank:] : tabulações e espaços.
- [:space:] : Todos os espaços em branco, incluindo caracteres de nova linha.
- [:graph:] : Todos os caracteres, incluindo símbolos, mas não espaços.
- [:print:] : Todos os caracteres, incluindo símbolos, incluindo espaços.
- [:punct:] : Todos os caracteres de pontuação.
- [:inferior:] : Letras minúsculas.
- [:upper:] : Letras maiúsculas.
Podemos realizar nossas conversões de letras minúsculas para maiúsculas e maiúsculas para minúsculas com a mesma facilidade, usando tokens.
echo "How-To Geek" | tr '[:inferior:]' '[:superior:]'
echo "How-To Geek" | tr '[:superior:]' '[:inferior:]'
Invertendo as Partidas
A opção -c
(complemento) corresponde a todos os caracteres exceto aqueles no primeiro conjunto. Este comando converte tudo, exceto a letra “c” para um hífen ” -
“.
eco abcdefc | tr -c 'c' '-'
Este comando adiciona a letra “a” ao primeiro conjunto. Qualquer coisa além de “a” ou “c” é convertida em um caractere hypen ” -
”.
eco abcdefc | tr -c 'ac' '-'
Excluindo e espremendo caracteres
Podemos usar tr
para remover todos os caracteres, sem qualquer substituição.
Este comando usa a opção -d
(excluir) para remover qualquer ocorrência de “a”, “d” ou “f” do fluxo de entrada.
eco abcdefc | tr -d 'adf'
Esta é uma instância em que temos apenas um conjunto de caracteres na linha de comando, não dois.
Outra é quando usamos a opção -s
(squeeze-repeats). Esta opção reduz caracteres repetidos a um único caractere.
Este exemplo reduzirá as sequências repetidas do caractere de espaço a um único espaço.
echo "abc de fc" | tr -s '[:blank:]'
É um pouco confuso que o token [:blank:]
represente o caractere de espaço e o token [:space:]
represente todas as formas de espaço em branco, incluindo tabulações e caracteres de nova linha.
Nesse caso, poderíamos substituir [:blank:]
por [:space:]
e obter o mesmo resultado.
echo "abc de fc" | tr -s '[:espaço:]'
Excluindo caracteres
As diferenças entre [:blank:]
e [:space:]
tornam-se aparentes quando excluímos os caracteres. Para fazer isso, usamos a opção -d
(excluir) e fornecemos um conjunto de caracteres que tr
procurará em seu fluxo de entrada. Qualquer um que encontrar é removido.
echo "abc de fc" | tr -d '[:blank:]'
Os espaços são excluídos. Observe que obtemos uma nova linha depois que o fluxo de saída é gravado na janela do terminal. Se repetirmos esse comando e usarmos [:space:]
em vez de em branco, obteremos um resultado diferente.
echo "abc de fc" | tr -d '[:blank:]'
Desta vez, não iniciamos uma nova linha após a saída, o prompt de comando é colocado diretamente contra ela. Isso ocorre porque [:space:]
inclui novas linhas. Quaisquer espaços, tabulações e caracteres de nova linha são removidos do fluxo de entrada.
Claro, você também pode usar um caractere de espaço real.
echo "abc de fc" | tr-d''
Podemos facilmente excluir dígitos.
eco abcd123efg | tr -d '[:digito:]'
Combinando as opções -c
(complemento) e -d
(excluir), podemos excluir tudo, menos os dígitos.
eco abcd123efg | tr -cd '[:digito:]'
Observe que tudo, exceto dígitos, significa todas as letras e todos os espaços em branco; portanto, mais uma vez, perdemos a nova linha final.
Combinando e Dividindo Linhas
Se substituirmos espaços por caracteres de nova linha, podemos dividir uma linha de texto e colocar cada palavra em sua própria linha.
echo 'um dois três quatro' | tr' ' '\n'
Também podemos alterar o delimitador que separa as palavras. Este comando substitui dois pontos ” :
” por espaços.
echo 'um dois três quatro' | tr' ' ':'
Podemos encontrar qualquer delimitador em uso e substituí-lo por caracteres de nova linha, dividindo o texto difícil de ler em uma saída mais fácil de gerenciar.
A variável de ambiente path é uma string longa com vários caminhos de diretório. Dois pontos ” :
” separa cada caminho. Vamos alterá-los para caracteres de nova linha.
echo $PATH
echo $CAMINHO | tr ":" "\n"
Isso é muito mais fácil de analisar visualmente.
Se tivermos uma saída que queremos reformatar em uma única linha, também podemos fazer isso. O arquivo “lines.txt” contém algum texto, com uma palavra em cada linha. Vamos alimentá-lo em tr
e convertê-lo em uma única linha.
arquivos de gato.txt
linhas de gato.txt | tr '\n' ' '
Usando tr com tubos
Podemos usar a saída de tr
como entrada para outro programa ou até mesmo para o próprio tr
.
Este comando usa tr
quatro vezes.
- O primeiro
tr
exclui quaisquer hífens “-” da entrada. - O segundo
tr
comprime quaisquer espaços repetidos em espaços únicos. - O terceiro
tr
substitui os espaços por caracteres de sublinhado “_”. - O quarto e último
tr
converte a string em letras minúsculas.
echo "Arquivo-nome.txt mutilado" | tr -d '-' | tr -s ' ' | tr' ' '_' | tr '[:superior:]' '[:inferior:]'
RELACIONADO: Como usar Pipes no Linux
Simples é tão simples quanto
O comando tr
é ótimo porque é simples. Não há muito o que aprender nem lembrar. Mas sua simplicidade também pode ser sua ruína.
Não se engane, frequentemente você descobrirá que tr
permite que você faça o que precisa sem ter que buscar ferramentas mais complicadas como sed
.
No entanto, se você está lutando para fazer algo com tr
e se encontra construindo longas cadeias de comandos, provavelmente deveria usar sed
.