Linux / Comando tr: substituir, apagar e reduzir caracteres
tr substitui ou apaga caracteres recebidos pela entrada padrão e pode reduzir sequências de um mesmo caractere repetido. Ele não abre um arquivo pelo nome passado como argumento: forneça o conteúdo por um pipe ou por redirecionamento. Para substituir palavras ou padrões inteiros, escolha uma ferramenta de processamento de texto adequada ao padrão e à codificação.
Na conversão simples, os caracteres de um conjunto são associados aos do outro. Isso não equivale a procurar uma palavra: as letras escolhidas são transformadas onde quer que apareçam. Os exemplos abaixo usam dados ASCII, com uma seção separada para os limites de UTF-8.
Sintaxe, entrada padrão e conjuntos
tr [opção...] conjunto1 [conjunto2] < arquivo-de-entrada
Essa linha descreve a sintaxe. Substitua os marcadores pelos conjuntos e pelo arquivo desejados; o símbolo < faz o shell enviar o arquivo à entrada padrão. Um pipe (|) envia a saída de outro comando. Sem -d e com dois conjuntos, tr faz uma substituição; -d apaga os caracteres indicados.
Use aspas nos conjuntos, como '[:lower:]' e '[:upper:]', para evitar que o shell interprete seus símbolos antes de tr. Essas classes representam letras minúsculas e maiúsculas. Os conjuntos de tr não são expressões regulares completas. Consulte tr --version, tr --help ou man tr para a implementação instalada; as opções deste guia seguem o GNU Coreutils.
Preparar arquivos e converter letras ASCII
Abra um terminal Bash dedicado ao exercício em uma pasta onde possa criar arquivos. O bloco cria um diretório exclusivo e cinco arquivos pequenos para os exemplos seguintes. && impede que a preparação continue após uma falha; a última linha mostra uma conversão recebida por pipe. Use a mesma sessão e permaneça na pasta criada.
tr_demo=$(mktemp -d ./tr-demo.XXXXXX) &&
cd "$tr_demo" &&
export LC_ALL=C &&
printf 'alpha\r\nbeta\r\n' > windows-lines.txt &&
printf 'one two\t\tthree\nfour five\n' > notes.txt &&
printf 'A1 B2\nC3\n' > digits.txt &&
printf 'cat bat\n' > words.txt &&
printf 'az\303\241 \303\251\n' > utf8.txt &&
printf '%s\n' hello | tr '[:lower:]' '[:upper:]'
A saída final é HELLO. O ajuste export LC_ALL=C mantém um ambiente de byte único para estes exemplos ASCII e seus processos filhos. Fechar o terminal dedicado encerra esse ajuste para os comandos futuros; os arquivos de prática permanecem disponíveis.
O arquivo words.txt contém cat bat. Com tr 'cat' 'dog' < words.txt, o resultado é dog bog: c vira d, a vira o e t vira g, inclusive dentro de bat. Para procurar a palavra ou um padrão completo, consulte o guia de sed em inglês e escolha a regra de substituição apropriada.
Remover retornos de carro de texto CRLF
windows-lines.txt contém alpha e beta com finais CRLF: retorno de carro (CR, byte 0D) seguido de quebra de linha (LF, byte 0A). Para remover os caracteres CR e mostrar a saída:
tr -d '\r' < windows-lines.txt
A saída contém alpha e beta, uma por linha, agora terminadas apenas por LF. O arquivo original mantém seus bytes CRLF. Esse comando apaga todo CR da entrada, inclusive um CR que esteja no meio de uma linha; ele não verifica se cada CR pertence a um par CRLF.
Para conferir o exemplo por bytes, use od -An -tx1 windows-lines.txt e tr -d '\r' < windows-lines.txt | od -An -tx1. A primeira leitura termina cada linha em 0d 0a; a segunda tem apenas 0a nesses finais. Não confunda essa transformação com uma conversão geral de codificação de caracteres.
Reduzir espaços repetidos sem remover tabulações
notes.txt contém três espaços entre one e two, duas tabulações entre two e three e quatro espaços entre four e five. Para reduzir somente repetições do caractere espaço:
tr -s ' ' < notes.txt
A saída tem um espaço entre one e two e entre four e five. As duas tabulações entre two e three permanecem. -s ' ' não transforma tabulações em espaços e não apaga as quebras de linha.
Para converter espaços e tabulações horizontais em um único espaço, use tr -s '[:blank:]' ' ' < notes.txt. O resultado é one two three e four five, em duas linhas. Nesse uso com dois conjuntos, primeiro ocorre a substituição e depois a redução das repetições do conjunto de saída. A classe [:space:] também inclui espaços verticais, como a quebra de linha; usá-la no lugar de [:blank:] pode juntar linhas que deveriam permanecer separadas.
Converter maiúsculas e preservar os demais caracteres
Este exemplo converte letras maiúsculas ASCII em minúsculas, mantendo os números e o espaço:
printf 'HELLO 123\n' | tr '[:upper:]' '[:lower:]'
Saída esperada:
hello 123
O número 123 e a quebra de linha não pertencem à classe de letras maiúsculas, por isso permanecem. Na implementação GNU, se o segundo conjunto de uma substituição simples for mais curto, seu último caractere pode ser repetido para completar a associação. Por exemplo, printf 'abc cab\n' | tr 'abc' 'X' produz XXX XXX, e não uma troca de palavras.
Usar o complemento para manter caracteres escolhidos
-c seleciona o complemento do primeiro conjunto, isto é, o que está fora dele. Junto com -d, isso permite apagar tudo o que não foi listado. No arquivo digits.txt, tr -cd '0-9\n' < digits.txt produz 12 e 3, em linhas separadas. O intervalo 0-9 representa os algarismos ASCII neste ambiente C, e a quebra de linha foi preservada explicitamente.
Se você retirar a quebra de linha do conjunto permitido, ela também será apagada e os valores de linhas diferentes poderão se juntar. Isso não é uma validação de números: sinais, separadores decimais e outros caracteres relevantes podem ser perdidos. Use esse filtro apenas quando remover tais caracteres for o objetivo.
Reconhecer o limite de UTF-8
UTF-8 representa alguns caracteres com vários bytes. A documentação atual do GNU tr limita o suporte completo a localidades seguras de byte único; definir uma localidade UTF-8 não o transforma automaticamente em um conversor Unicode.
utf8.txt contém azá é. Na verificação com GNU tr 8.32 do Git para Windows, LC_ALL=C.UTF-8 tr '[:lower:]' '[:upper:]' < utf8.txt produziu AZá é: as letras ASCII mudaram, mas os acentos não foram convertidos para maiúsculas. A localidade do teste foi confirmada como UTF-8. Esse resultado identifica a implementação testada.
Também não use a remoção de um caractere multibyte como se cada letra fosse uma unidade independente nessa implementação: bytes compartilhados por outras letras podem ser removidos e gerar texto inválido. Para transformações de letras acentuadas ou outros alfabetos, use uma ferramenta que interprete a codificação e a operação Unicode pretendida. Mudar para LC_ALL=C torna a interpretação por bytes previsível, mas não resolve a conversão Unicode.
Salvar o resultado sem alterar a entrada
Para salvar a versão com finais LF em um arquivo novo, use (set -C; tr -d '\r' < windows-lines.txt > unix-lines.txt). Após sucesso, confira com cat unix-lines.txt ou com od. O ajuste set -C fica no comando entre parênteses e impede sobrescrever esse arquivo regular se ele já existir; escolha outro nome nesse caso.
Não use o mesmo arquivo como entrada e destino. O redirecionamento do shell pode esvaziá-lo antes de tr começar a ler. Preserve o original e confira os bytes ou o texto resultante antes de substituir um arquivo importante.
Opções e classes principais
| Opção ou classe | Uso |
|---|---|
-d |
Apaga os caracteres selecionados, sem fazer substituição. |
-s |
Reduz repetições de um mesmo caractere do último conjunto especificado. |
-c |
Usa o complemento do primeiro conjunto. |
[:lower:] / [:upper:] |
Classes de letras minúsculas e maiúsculas; confira os limites da implementação e da codificação. |
[:blank:] |
Espaços horizontais; nos exemplos C, espaço e tabulação. |
Pergunta frequente
Posso passar o nome do arquivo diretamente a tr?
Não como um argumento de arquivo de entrada. Os argumentos comuns representam os conjuntos usados na transformação. Forneça o conteúdo com redirecionamento, como tr -s ' ' < notes.txt, ou por um pipe. Salve a saída em um arquivo diferente quando necessário.
Documentação oficial
Consulte a página de manual de tr publicada pelo Debian e a seção do GNU sobre conjuntos de caracteres e limites de localidades multibyte. A seção sobre redução de repetições e remoção detalha a combinação das operações.




