Como usar o comando tr do Linux


0
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.

O que é o comando tr?

o linux tr O comando é um utilitário rápido e simples para remover caracteres indesejados de fluxos de texto e para outros truques de manipulação. Seu nome vem da palavra “traduzir” e trAs raízes do Unix 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 tr vem por conta própria. 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 de tr para ter várias transformações aplicadas ao fluxo.

Substituindo caracteres

O tr O comando 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 substitua cada ocorrência pela letra “z”. Observe que tr diferencia maiúsculas de minúsculas.

estamos usando echo para empurrar algum texto para dentro tr .

echo 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”.

echo 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 'call me Ishmael.' | 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 o -t (truncar) opção. Isso substitui apenas os caracteres contidos no conjunto um que possuem um caractere correspondente no conjunto dois.

echo 'call me Ishmael.' | 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, [a-z] representa todas as letras minúsculas e [A-Z] 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 '[a-z]' '[A-Z]'

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 '[A-Z]' '[a-z]'

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:]: Tabs 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.
  • [:lower:]: 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 '[:lower:]' '[:upper:]'
echo "How-To Geek" | tr '[:upper:]' '[:lower:]'

Usando tokens para alterar o caso de strings de texto

Invertendo as Partidas

O -c (complemento) corresponde a todos os caracteres, exceto os do primeiro conjunto. Este comando converte tudo, exceto a letra “c” para um hífen ” - “.

echo 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 hífen ” - ” personagem.

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

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

Excluindo e espremendo caracteres

Podemos usar tr para remover caracteres completamente, sem qualquer substituição.

Este comando usa o -d (excluir) opção para remover qualquer ocorrência de “a”, “d” ou “f” do fluxo de entrada.

echo 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 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 "a  b  c    de   f   c" | tr -s '[:blank:]'

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

É um pouco confuso que o [:blank:] token representa o caractere de espaço e o [:space:] token representa todas as formas de espaço em branco, incluindo tabulações e caracteres de nova linha.

Neste caso, poderíamos substituir [:blank:] com [:space:] e obter o mesmo resultado.

echo "a  b  c     de   f   c" | tr -s '[:space:]'

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 caracteres. Para fazer isso, usamos o -d (excluir) e forneça um conjunto de caracteres que tr irá procurar em seu fluxo de entrada. Qualquer um que encontrar é removido.

echo "a  b  c     de   f   c" | 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 "a  b  c    de   f   c" | 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. Isto é 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 "a  b  c    de   f   c" | tr -d ' '

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

Podemos facilmente excluir dígitos.

echo abcd123efg | tr -d '[:digit:]'

Excluindo dígitos de uma string de texto com tr

Ao combinar o -c (complemento) e -d (excluir) opções, podemos excluir tudo, exceto dígitos.

echo abcd123efg | tr -cd '[:digit:]'

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, então, 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 'one two three four' | 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 ” : ” para espaços.

echo 'one two three four' | 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 $PATH | 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 alimentar isso em tr e convertê-lo em uma única linha.

cat files.txt
cat lines.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 mesmo para tr em si.

Este comando usa tr quatro vezes.

  • O primeiro tr exclui quaisquer hífens “-” da entrada.
  • O segundo tr espreme todos os espaços repetidos em espaços únicos.
  • O terceiro tr substitui os espaços por caracteres de sublinhado “_”.
  • A quarta e última tr converte a string para letras minúsculas.
echo "Mangled FiLE-nAMe.txt" | tr -d '-' | tr -s ' ' | tr ' ' '_' | tr '[:upper:]' '[:lower:]'

Um pipeline de quatro instâncias de tr

RELACIONADO: Como usar pipes no Linux

Simples é tão simples quanto

O tr O comando é ó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 você se encontra construindo longas cadeias de comandos, provavelmente deveria estar usando sed.


Like it? Share with your friends!

0

0 Comments

Your email address will not be published. Required fields are marked *