Como usar o comando tr do Linux

Publicados: 2023-05-17
Tela de inicialização do Ubuntu Linux em um laptop
Jordan Gloor / How-To Geek
O comando tr realiza transformações em um fluxo de texto, produzindo um novo fluxo como saída. Você pode substituir, excluir ou converter caracteres de acordo com as regras definidas na linha de comando.

Você 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.

Índice

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' 

Substituindo um único caractere por tr

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' 

Removendo duas letras com tr

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' 

Usando conjuntos desbalanceados de caracteres com tr

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 conjuntos desbalanceados de caracteres com tr com a opção truncar

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]' 

Usando intervalos de caracteres para converter uma string em letras maiúsculas

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]' 

Usando intervalos de caracteres para converter uma string em letras minúsculas

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:]' 

Usando tokens para alterar o caso de strings de texto

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' '-' 

Substituindo todos, exceto os caracteres especificados, por outros caracteres

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' '-' 

Substituindo todos, exceto os vários caracteres especificados, por outros caracteres

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' 

Excluindo vários caracteres de uma string de texto com tr

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:]' 

Alterar sequências repetidas de caracteres para uma única ocorrência do caractere, com tr

É 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:]' 

Alterar sequências repetidas de caracteres para uma única ocorrência do caractere, com tr

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:]' 

Excluindo espaços em branco (caracteres de espaço) de uma string de texto, com tr

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:]' 

Excluindo espaço em branco de uma string de texto, com tr

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'' 

Excluindo espaços de uma string de texto, especificando um caractere de espaço, com tr

Podemos facilmente excluir dígitos.

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

Excluindo dígitos de uma string de texto com tr

Combinando as opções -c (complemento) e -d (excluir), podemos excluir tudo, menos os dígitos.

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

Excluindo tudo, exceto dígitos, de uma string de texto usando tr

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' 

Dividindo uma linha de texto em uma palavra por linha, com tr

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' ' ':' 

Mudando o delimitador de palavras de espaços para dois pontos, com 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" 

Dividindo a variável de ambiente $PATH em caminhos de diretório separados, um por linha, com tr

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' ' ' 

Combinando entrada de várias linhas em uma única linha de texto, usando tr

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:]' 

Um pipeline de quatro instâncias de tr

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 .

Como usar o comando sed no Linux
RELACIONADO Como usar o comando sed no Linux

No entanto, se você está lutando para fazer algo com tr e se encontra construindo longas cadeias de comandos, provavelmente deveria usar sed .