Comment utiliser la commande Linux tr

Publié: 2023-05-17
Écran de démarrage d'Ubuntu Linux sur un ordinateur portable
Jordan Gloor / How-To Geek
La commande tr effectue des transformations sur un flux de texte, produisant un nouveau flux en sortie. Vous pouvez substituer, supprimer ou convertir des caractères selon les règles que vous définissez sur la ligne de commande.

Avez-vous besoin d'une méthode simple pour manipuler un flux de texte sous Linux ? Ne cherchez pas plus loin que la commande tr, qui peut vous faire gagner du temps pour remplacer, supprimer, combiner et compresser le texte d'entrée. C'est comme ça que c'est fait.

Table des matières

Qu'est-ce que la commande tr ?
Remplacement de caractères
Utiliser des plages et des jetons
Inverser les correspondances
Suppression et compression de caractères
Suppression de caractères
Combiner et diviser des lignes
Utilisation de tr avec des tuyaux
Simple est aussi simple

Qu'est-ce que la commande tr ?

La commande Linux tr est un utilitaire simple et rapide pour supprimer les caractères indésirables des flux de texte et pour d'autres astuces de manipulation soignées. Il tire son nom du mot « traduire », et les racines de tr sont profondément ancrées dans la tradition Unix.

Comme nous le savons tous, Linux est une réécriture open source d'Unix. Il ajoute également ses propres éléments au mélange. Ce n'est pas un clone octet par octet, mais il tire clairement une grande partie de ses principes de conception et de sa direction technique du système d'exploitation Unix.

Bien que seules deux distributions Linux aient jusqu'à présent été certifiées conformes à POSIX et approuvées comme étant officiellement acceptées comme implémentations d'Unix - EulerOS et Inspur K-UX - Linux a presque complètement supplanté Unix dans le monde des affaires.

Toutes les distributions Linux, au moins dans leurs utilitaires de base, adhèrent à la philosophie Unix. La philosophie Unix résume la vision que les pionniers Unix avaient de leur nouveau système d'exploitation. Il est souvent paraphrasé comme étant "Écrivez des programmes qui font bien une chose". Mais il y a plus que cela.

L'une des innovations les plus puissantes était que les programmes devaient générer des sorties pouvant être utilisées comme entrées pour d'autres programmes. La possibilité de connecter en guirlande des utilitaires de ligne de commande, en utilisant le flux de sortie d'un programme comme flux d'entrée vers le programme suivant en ligne, est extrêmement puissante.

Parfois, vous voudrez affiner ou modifier la sortie d'un programme avant qu'il n'atteigne le programme suivant en ligne. Ou peut-être que vous ne prenez pas votre entrée à partir d'un outil de ligne de commande Linux, vous diffusez du texte à partir d'un fichier qui n'a pas été créé en tenant compte de vos besoins particuliers.

C'est là que tr prend tout son sens. Il vous permet d'effectuer un ensemble de transformations simples sur son flux d'entrée, pour produire son flux de sortie. Ce flux de sortie peut être redirigé vers un fichier, introduit dans un autre programme Linux ou même dans une autre instance de tr pour appliquer plusieurs transformations au flux.

Remplacement de caractères

La commande tr opère sur son flux d'entrée selon des règles. Utilisé sans aucune option de ligne de commande, l'action par défaut de tr consiste à remplacer les caractères du flux d'entrée par d'autres caractères.

Les commandes de tr nécessitent généralement deux jeux de caractères. Le premier ensemble contient les caractères qui seront remplacés s'ils sont trouvés dans le flux d'entrée. Le deuxième ensemble contient les caractères par lesquels ils seront remplacés.

La façon dont cela fonctionne est que les occurrences du premier caractère du jeu un seront remplacées par le premier caractère du jeu deux. Les occurrences du deuxième caractère du premier jeu seront remplacées par le deuxième caractère du deuxième jeu, et ainsi de suite.

Cet exemple recherchera la lettre "c" dans le flux d'entrée de tr et remplacera chaque occurrence par la lettre "z". Notez que tr est sensible à la casse.

Nous utilisons echo pour pousser du texte dans tr .

 echo abcdefabc | tr 'c' 'z' 

Remplacer un seul caractère par tr

Toutes les occurrences de "c" sont remplacées par "z" et la nouvelle chaîne est écrite dans la fenêtre du terminal.

Cette fois, nous allons rechercher deux lettres, "a" et "c". Notez que nous ne recherchons pas "ac". Nous recherchons "a", puis recherchons "c". Nous allons remplacer toute occurrence de "a" par "x" et toute occurrence de "c" par "z".

 echo abcdefabc | tr 'ac' 'xz' 

Suppression de deux lettres avec tr

Pour que cela fonctionne, vous devez avoir le même nombre de caractères dans les deux ensembles. Si vous ne le faites pas, vous obtiendrez un comportement prévisible, mais probablement indésirable.

 echo 'appelez-moi Ismaël.' | tr 'abcdjklm' '123' 

Utilisation de jeux de caractères déséquilibrés avec tr

Il y a plus de personnages dans l'ensemble un que dans l'ensemble deux. Les lettres « d » à « m » n'ont pas de caractère correspondant dans le deuxième ensemble. Ils seront toujours remplacés, mais ils sont tous remplacés par le dernier personnage du deuxième set.

Il est à peu près possible que cela puisse être utile dans certains cas, mais si vous voulez éviter cela, vous pouvez utiliser l'option -t (tronquer). Cela remplace uniquement les caractères contenus dans le jeu un qui ont un caractère correspondant dans le jeu deux.

 echo 'appelez-moi Ismaël.' | tr -t 'abcdjklm' '123' 

Utilisation de jeux de caractères déséquilibrés avec tr avec l'option truncate

Utiliser des plages et des jetons

L'ensemble un et l'ensemble deux peuvent contenir des plages de caractères. Par exemple, [az] représente toutes les lettres minuscules et [AZ] représente toutes les lettres majuscules. Nous pouvons nous en servir pour changer la casse d'un flux de texte.

Cela convertira le flux d'entrée en majuscules.

 echo "Comment Geek" | tr '[az]' '[AZ]' 

Utiliser des plages de caractères pour convertir une chaîne en majuscule

Pour inverser la casse dans l'autre sens, nous pouvons utiliser la même commande mais avec les plages majuscules et minuscules permutées sur la ligne de commande.

 echo "Comment Geek" | tr '[AZ]' '[az]' 

Utilisation de plages de caractères pour convertir une chaîne en minuscules

Il existe des jetons que nous pouvons utiliser pour certains des cas courants avec lesquels nous pourrions vouloir faire correspondre.

  • [:alnum:] : Lettres et chiffres.
  • [:alpha:] : Lettres uniquement.
  • [:digit:] : Chiffres uniquement.
  • [:blank:] : tabulations et espaces.
  • [:space:] : Tous les espaces blancs, y compris les caractères de saut de ligne.
  • [:graph:] : Tous les caractères, y compris les symboles, mais pas les espaces.
  • [:print:] : Tous les caractères, y compris les symboles, y compris les espaces.
  • [:punct:] : Tous les caractères de ponctuation.
  • [:lower:] : Lettres minuscules.
  • [:upper:] : Lettres majuscules.

Nous pouvons effectuer nos conversions minuscules en majuscules et majuscules en minuscules tout aussi facilement, en utilisant des jetons.

 echo "Comment Geek" | tr '[:inférieur :]' '[:supérieur :]'
 echo "Comment Geek" | tr '[:supérieur :]' '[:inférieur :]' 

Utilisation de jetons pour modifier la casse des chaînes de texte

Inverser les correspondances

L'option -c (complément) correspond à tous les caractères à l'exception de ceux du premier ensemble. Cette commande convertit tout sauf la lettre "c" en un trait d'union " - ".

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

Remplacer tous les caractères sauf les caractères spécifiés par d'autres caractères

Cette commande ajoute la lettre "a" au premier ensemble. Tout ce qui n'est pas "a" ou "c" est converti en un trait d'union " - ".

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

Remplacer tous les caractères sauf les multiples spécifiés par d'autres caractères

Suppression et compression de caractères

Nous pouvons utiliser tr pour supprimer complètement des caractères, sans aucun remplacement.

Cette commande utilise l'option -d (supprimer) pour supprimer toute occurrence de "a", "d" ou "f" du flux d'entrée.

 echo abcdefc | tr -d 'adf' 

Suppression de plusieurs caractères d'une chaîne de texte avec tr

C'est un cas où nous n'avons qu'un seul jeu de caractères sur la ligne de commande, pas deux.

Une autre est lorsque nous utilisons l'option -s (squeeze-repeats). Cette option réduit les caractères répétés à un seul caractère.

Cet exemple réduira les séquences répétées du caractère espace à un seul espace.

 echo "abc de fc" | tr -s '[:blank:]' 

Changer des séquences répétées de caractères en une seule occurrence du caractère, avec tr

Il est un peu déroutant que le jeton [:blank:] représente le caractère d'espace, et le jeton [:space:] représente toutes les formes d'espaces, y compris les tabulations et les caractères de saut de ligne.

Dans ce cas, nous pourrions remplacer [:blank:] par [:space:] et obtenir le même résultat.

 echo "abc de fc" | tr -s '[:espace:]' 

Changer des séquences répétées de caractères en une seule occurrence du caractère, avec tr

Suppression de caractères

Les différences entre [:blank:] et [:space:] deviennent évidentes lorsque nous supprimons des caractères. Pour ce faire, nous utilisons l'option -d (supprimer) et fournissons un ensemble de caractères que tr recherchera dans son flux d'entrée. Tout ce qu'il trouve est supprimé.

 echo "abc de fc" | tr -d '[:blank:]' 

Suppression des blancs (caractères d'espacement) d'une chaîne de texte, avec tr

Les espaces sont supprimés. Notez que nous obtenons une nouvelle ligne après l'écriture du flux de sortie dans la fenêtre du terminal. Si nous répétons cette commande et utilisons [:space:] au lieu de blanc, nous obtiendrons un résultat différent.

 echo "abc de fc" | tr -d '[:blank:]' 

Supprimer les espaces d'une chaîne de texte, avec tr

Cette fois, nous ne commençons pas une nouvelle ligne après la sortie, l'invite de commande est collée contre elle. C'est parce que [:space:] inclut des retours à la ligne. Tous les espaces, tabulations et sauts de ligne sont supprimés du flux d'entrée.

Bien sûr, vous pouvez également utiliser un caractère d'espace réel.

 echo "abc de fc" | tr -d ' ' 

Suppression d'espaces dans une chaîne de texte, en spécifiant un caractère d'espace, avec tr

Nous pouvons tout aussi facilement supprimer des chiffres.

 écho abcd123efg | tr -d '[:chiffre:]' 

Suppression de chiffres d'une chaîne de texte avec tr

En combinant les options -c (compléter) et -d (supprimer), nous pouvons tout supprimer sauf les chiffres.

 écho abcd123efg | tr -cd '[:chiffre:]' 

Supprimer tout sauf les chiffres d'une chaîne de texte à l'aide de tr

Notez que tout, à l'exception des chiffres, signifie toutes les lettres et tous les espaces, donc une fois de plus, nous perdons le retour à la ligne de fin.

Combiner et diviser des lignes

Si nous remplaçons les espaces par des caractères de retour à la ligne, nous pouvons diviser une ligne de texte et placer chaque mot sur sa propre ligne.

 echo 'un deux trois quatre' | tr ' ' '\n' 

Fractionnement d'une ligne de texte en un mot par ligne, avec tr

Nous pouvons également modifier le délimiteur qui sépare les mots. Cette commande substitue les deux-points ” : ” aux espaces.

 echo 'un deux trois quatre' | tr ' ' ':' 

Changer le délimiteur de mots d'espaces en deux-points, avec tr

Nous pouvons trouver n'importe quel délimiteur utilisé et le remplacer par des caractères de nouvelle ligne, divisant le texte difficile à lire en une sortie plus facile à gérer.

La variable d'environnement path est une longue chaîne de plusieurs chemins de répertoire. Un deux-points ” : ” sépare chaque chemin. Nous allons les changer en caractères de saut de ligne.

 echo $CHEMIN
 echo $CHEMIN | tr ":" "\n" 

Fractionnement de la variable d'environnement $PATH en chemins de répertoire séparés, un par ligne, avec tr

C'est beaucoup plus facile à analyser visuellement.

Si nous avons une sortie que nous voulons reformater en une seule ligne, nous pouvons également le faire. Le fichier "lines.txt" contient du texte, avec un mot sur chaque ligne. Nous allons l'introduire dans tr et le convertir en une seule ligne.

 chat fichiers.txt
 lignes de chat.txt | tr '\n' ' ' 

Combinaison d'une entrée multiligne en une seule ligne de texte, à l'aide de tr

Utilisation de tr avec des tuyaux

Nous pouvons utiliser la sortie de tr comme entrée pour un autre programme, ou même pour tr lui-même.

Cette commande utilise tr quatre fois.

  • Le premier tr supprime tous les traits d'union "-" de l'entrée.
  • Le deuxième tr comprime tous les espaces répétés en espaces simples.
  • Le troisième tr remplace les espaces par des caractères de soulignement "_".
  • Le quatrième et dernier tr convertit la chaîne en minuscules.
 echo "FiLE-nAMe.txt mutilé" | tr -d '-' | tr -s ' ' | tr ' ' '_' | tr '[:supérieur :]' '[:inférieur :]' 

Un pipeline de quatre instances de tr

CONNEXION: Comment utiliser les tuyaux sous Linux

Simple est aussi simple

La commande tr est géniale car elle est simple. Il n'y a pas grand chose à apprendre ni à retenir. Mais sa simplicité peut aussi être sa chute.

Ne vous y trompez pas, vous constaterez souvent que tr vous permet de faire ce dont vous avez besoin sans avoir à utiliser des outils plus compliqués comme sed .

Comment utiliser la commande sed sous Linux
CONNEXION Comment utiliser la commande sed sous Linux

Cependant, si vous avez du mal à faire quelque chose avec tr et que vous vous retrouvez à construire de longues chaînes de commandes en guirlande, vous devriez probablement utiliser sed .