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
- GNU Coreutils: tr invocation — Documentação oficial do GNU Coreutils sobre o comando
tr, com especificações detalhadas de todas as opções e classes POSIX. - Linux man page: tr(1) — Página de manual completa do comando
tr, incluindo exemplos de sintaxe e comportamento. - The Linux Information Project: tr command — Tutorial introdutório sobre o comando
tr, com exemplos práticos de uso no terminal. - How to Use the tr Command in Linux — Guia prático do How-To Geek com exemplos variados de tradução, deleção e compressão de caracteres.
- Linuxize: tr Command in Linux with Examples — Tutorial completo com exemplos avançados de uso do
trem scripts e pipelines.