Linux / Commande tr : remplacer, supprimer et compresser des caractères

tr transforme les caractères reçus sur l'entrée standard : il peut les remplacer, les supprimer ou réduire leurs répétitions. Il ne lit pas un fichier en recevant son nom comme argument ; fournissez son contenu avec un tube ou une redirection <. Les ensembles de caractères de tr ne sont pas des motifs de recherche de mots.

Pour remplacer une chaîne selon son contexte ou une expression régulière, choisissez un outil tel que sed. Pour des transformations simples de caractères ASCII, tr permet en revanche des filtres courts et lisibles. Les exemples emploient LC_ALL=C pour expliciter les règles utilisées ; ce réglage ne transforme pas tr en outil de conversion Unicode.

Syntaxe et préparation des fichiers

tr [options] ensemble1 [ensemble2] < fichier

Sans option de suppression, deux ensembles décrivent normalement les correspondances de remplacement. Avec -d, le premier indique les caractères à retirer. Avec -s, le dernier ensemble indiqué détermine les caractères dont les répétitions sont réduites. Consultez man tr pour votre implémentation.

Préparez les données de l'exercice dans un nouveau répertoire Bash :

tr_lab=$(mktemp -d "$HOME/tr-lab.XXXXXX")
cd -- "$tr_lab"
printf 'alpha\r\nbeta\r\n' > windows-lines.txt
printf 'alpha   beta\t\tgamma\n' > notes.txt

Le premier fichier utilise des fins de ligne composées d'un retour chariot, ou CR, puis d'un saut de ligne, ou LF. Le second contient trois espaces puis deux tabulations. Le répertoire est propre à l'exercice ; notez son chemin et utilisez ensuite cd "$HOME" pour le quitter.

Changer la casse ou traduire des caractères

Pour convertir des lettres anglaises minuscules en majuscules, fournissez l'entrée par un tube :

printf '%s\n' hello | LC_ALL=C tr '[:lower:]' '[:upper:]'
HELLO

Les classes [:lower:] et [:upper:] représentent les ensembles de minuscules et de majuscules de la locale. Les guillemets empêchent le shell d'interpréter ces arguments comme des motifs de noms de fichiers. Dans la locale C, cet exemple concerne les lettres ASCII.

printf 'HELLO 123\n' | LC_ALL=C tr '[:upper:]' '[:lower:]'
hello 123

Les chiffres et l'espace ne font pas partie des caractères à traduire ; ils sont conservés. Avec des ensembles explicites de même taille, les caractères correspondent position par position :

printf 'abba\n' | LC_ALL=C tr 'ab' 'XY'

Le résultat est XYYX, car chaque a devient X et chaque b devient Y. La commande ne remplace pas le mot ab comme un bloc.

Supprimer des caractères et traiter CRLF

L'option -d retire chacun des caractères appartenant au premier ensemble :

printf 'cabdab\n' | LC_ALL=C tr -d 'ab'

La sortie est cd. Les lettres a et b sont supprimées partout, sans rechercher uniquement leur succession ab.

Sur le fichier d'exercice dont les fins de ligne sont CRLF, cette commande retire les retours chariot :

LC_ALL=C tr -d '\r' < windows-lines.txt
alpha
beta

\r désigne CR ; les LF sont conservés. La commande retire toutefois tous les CR du flux, pas seulement ceux situés juste avant un LF. Utilisez cette méthode seulement si cette suppression correspond au format réel des données. Elle ne décode pas un fichier UTF-16 et ne constitue pas une conversion générale d'encodage.

Réduire les espaces sans confondre les tabulations

LC_ALL=C tr -s ' ' < notes.txt

Les trois espaces entre alpha et beta deviennent un seul espace. Les deux tabulations entre beta et gamma restent présentes, car elles ne figurent pas dans l'ensemble ' '. Pour rendre les caractères du résultat observables sans dépendre de l'affichage du terminal, vous pouvez examiner leurs valeurs hexadécimales :

LC_ALL=C tr -s ' ' < notes.txt | od -An -tx1

Entre les octets de beta et de gamma, les deux valeurs 09 09 correspondent aux tabulations. Un espace a la valeur 20 et un LF la valeur 0a.

Pour uniformiser d'abord les blancs horizontaux, puis réduire les répétitions d'espaces :

LC_ALL=C tr '\t' ' ' < notes.txt | LC_ALL=C tr -s ' '
alpha beta gamma

Une compression ne transforme pas à elle seule plusieurs types de blancs en un seul caractère. Évitez aussi de supprimer ou convertir aveuglément [:space:] : cette classe inclut des séparations verticales, notamment les sauts de ligne, ce qui peut fusionner des enregistrements.

Utiliser le complément et connaître les limites

-c prend le complément du premier ensemble. Avec -d, vous pouvez ainsi conserver uniquement les caractères autorisés. Cet exemple garde les chiffres ASCII et les sauts de ligne :

printf 'A12-B3\nC4\n' | LC_ALL=C tr -cd '[:digit:]\n'
123
4

Sans le \n de l'ensemble autorisé, les séparations entre lignes seraient supprimées. Un tel filtrage est une transformation de données, pas une validation : retirer silencieusement les caractères inattendus peut changer le sens d'une valeur.

Les arguments de tr sont des ensembles de caractères, pas des expressions régulières complètes. Les plages et les classes dépendent de la locale et de l'implémentation. Le manuel GNU indique que tr ne prend pleinement en charge que les locales sûres à un octet ; une substitution de lettres accentuées UTF-8 ne doit donc pas être supposée correcte.

Pour une conversion Unicode, choisissez un outil qui traite explicitement les caractères dans l'encodage concerné et vérifiez le résultat. LC_ALL=C rend les exemples ASCII reproductibles, mais n'ajoute pas la prise en charge d'un alphabet multioctet.

Enregistrer dans un nouveau fichier

La lecture par redirection ne modifie pas la source. Pour conserver la sortie de la suppression des CR, donnez-lui un autre nom :

LC_ALL=C tr -d '\r' < windows-lines.txt > unix-lines.txt
od -An -tx1 windows-lines.txt
od -An -tx1 unix-lines.txt

Le fichier initial contient encore les paires 0d 0a ; le nouveau contient seulement 0a aux fins de ligne. Cette vérification distingue une vraie modification d'octets d'une simple différence d'affichage.

Ne redirigez pas vers la source avec tr … < fichier > fichier. Le shell peut la vider avant sa lecture. Choisissez une destination qui n'écrase aucun document utile, puis examinez-la avant tout remplacement. La source conservée vous permet de reprendre la conversion avec d'autres paramètres.

Option ou notation Rôle
-d Supprimer les caractères du premier ensemble.
-s Réduire les suites répétées d'un même caractère du dernier ensemble indiqué.
-c Utiliser le complément du premier ensemble.
[:lower:], [:upper:] Décrire les classes de minuscules et de majuscules.
\r, \n, \t Désigner CR, LF et la tabulation.

Le manuel officiel de GNU tr détaille les options. Sa section sur les ensembles de caractères et les restrictions de locale précise les limites à vérifier avant d'utiliser des caractères multioctets.