Tr: traduzindo e deletando caracteres

1. Introdução ao comando tr

O comando tr (abreviação de "translate") é uma ferramenta clássica do Unix/Linux projetada para traduzir, deletar e comprimir caracteres em fluxos de texto. Sua sintaxe é enxuta e seu funcionamento é direto: ele opera exclusivamente sobre a entrada padrão (stdin) e envia o resultado para a saída padrão (stdout), sem modificar arquivos diretamente.

Diferentemente de comandos como sed e awk, que oferecem recursos de edição baseados em expressões regulares e lógica condicional, o tr trabalha exclusivamente com mapeamento caractere a caractere. Enquanto sed pode substituir padrões complexos e awk permite manipulação de campos e cálculos, o tr é ideal para transformações simples e rápidas: converter caixa, remover caracteres indesejados ou normalizar espaçamento.

Por sua simplicidade e eficiência, o tr é frequentemente utilizado em pipelines, processando a saída de outros comandos antes de enviá-la para processamento posterior.

2. Sintaxe e conjuntos de caracteres

A estrutura básica do comando é:

tr [opções] conjunto1 [conjunto2]

Os conjuntos de caracteres podem ser definidos de três formas principais:

Literais: caracteres comuns digitados diretamente

echo "hello" | tr 'h' 'H'    # Substitui 'h' por 'H'

Intervalos: usando o hífen para especificar sequências

echo "abc123" | tr 'a-z' 'A-Z'    # Converte minúsculas em maiúsculas

Classes POSIX: conjuntos predefinidos portáveis

echo "Teste 123" | tr '[:lower:]' '[:upper:]'    # Equivalente ao anterior

As classes POSIX mais comuns incluem: [:alnum:], [:alpha:], [:digit:], [:lower:], [:upper:], [:space:], [:punct:] e [:cntrl:].

Para caracteres especiais, usamos escapes:

echo -e "linha1\nlinha2" | tr '\n' ' '    # Substitui quebras de linha por espaços
echo -e "col1\tcol2" | tr '\t' ','        # Converte tabulações em vírgulas

3. Tradução de caracteres (substituição um-para-um)

A operação fundamental do tr é o mapeamento direto: cada caractere do conjunto1 é substituído pelo caractere correspondente na mesma posição do conjunto2.

Converter maiúsculas em minúsculas:

echo "TEXTO EM CAIXA ALTA" | tr 'A-Z' 'a-z'
# Saída: texto em caixa alta

Converter minúsculas em maiúsculas:

echo "texto em caixa baixa" | tr 'a-z' 'A-Z'
# Saída: TEXTO EM CAIXA BAIXA

Substituir vogais por números:

echo "aeiou" | tr 'aeiou' '12345'
# Saída: 12345

Quando os conjuntos têm tamanhos diferentes, o último caractere do conjunto2 é repetido para preencher a diferença:

echo "abcdef" | tr 'a-f' 'x'
# Saída: xxxxxx

4. Deleção de caracteres com -d

A opção -d (delete) remove todos os caracteres especificados no conjunto1, sem necessidade de um segundo conjunto.

Remover dígitos de um texto:

echo "Telefone: (11) 98765-4321" | tr -d '0-9'
# Saída: Telefone: () -

Eliminar pontuação:

echo "Olá, mundo! Como vai?" | tr -d '[:punct:]'
# Saída: Olá mundo Como vai

Remover quebras de linha (unir linhas):

echo -e "linha1\nlinha2\nlinha3" | tr -d '\n'
# Saída: linha1linha2linha3

Remover espaços em branco:

echo "texto com espaços" | tr -d ' '
# Saída: textocomespaços

5. Compressão de repetições com -s

A opção -s (squeeze) reduz sequências repetidas de um caractere a uma única ocorrência.

Normalizar espaços entre palavras:

echo "texto    com   muitos     espaços" | tr -s ' '
# Saída: texto com muitos espaços

Eliminar linhas vazias consecutivas:

echo -e "linha1\n\n\nlinha2" | tr -s '\n'
# Saída: linha1
#        linha2

Combinar tradução com compressão:

echo "aaa bbb ccc" | tr -s 'a-z' 'A-Z'
# Saída: A B C

Comprimir caracteres especiais:

echo "!!!!Atenção!!!!" | tr -s '!'
# Saída: !Atenção!

6. Complemento de conjuntos com -c

A opção -c (complement) inverte a seleção: em vez de atuar sobre os caracteres especificados, atua sobre todos os demais.

Deletar tudo exceto dígitos:

echo "Preço: R$ 1.234,56" | tr -cd '0-9.,'
# Saída: 1.234,56

Extrair apenas letras:

echo "123abc456def789" | tr -cd 'a-zA-Z'
# Saída: abcdef

Manter apenas caracteres alfanuméricos:

echo "Senha@secreta#123!" | tr -cd '[:alnum:]'
# Saída: Senhasecreta123

Converter tudo que não é espaço em um caractere:

echo "nome idade cidade" | tr -c ' ' '-'
# Saída: ---- ----- ------

7. Casos de uso avançados e integração com pipes

Limpeza de arquivos Windows (remover \r):

cat arquivo_windows.txt | tr -d '\r' > arquivo_unix.txt

Pipeline completo: normalizar texto e contar palavras:

echo "Olá!!! Mundo... Como vai? Tudo bem?!" | tr -sc 'A-Za-z' '\n' | sort | uniq -c | sort -rn
# Saída:
#       1 vai
#       1 Tudo
#       1 Olá
#       1 Mundo
#       1 Como
#       1 bem

Converter texto para slug URL:

echo "Artigo sobre Bash/Shell Script!" | tr '[:upper:]' '[:lower:]' | tr -sc 'a-z0-9' '-'
# Saída: artigo-sobre-bashshell-script-

Extrair números de um arquivo de log:

echo "Erro 404 na linha 23: arquivo não encontrado" | tr -cd '0-9 \n'
# Saída: 404 23

Processar CSV mal formatado:

echo "nome;;idade;cidade" | tr -s ';'
# Saída: nome;idade;cidade

O tr é uma ferramenta indispensável no arsenal de qualquer usuário de shell. Sua simplicidade e eficiência o tornam ideal para transformações rápidas de texto em pipelines, especialmente quando combinado com comandos como grep, sort, uniq e awk. Dominar suas opções básicas — tradução, deleção, compressão e complemento — permite resolver dezenas de problemas comuns de processamento de texto com apenas uma linha de comando.

Referências