Comment utiliser la commande Linux tr
Agence web » Actualités du digital » Comment utiliser la commande Linux tr

Comment utiliser la commande Linux tr

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.

Qu’est-ce que la commande tr ?

Le Linux tr La commande 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 trLes racines de 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 ici 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

Le tr commande fonctionne 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.

Commandes à 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 pour tr, et remplacez chaque occurrence par la lettre « z ». Noter que tr est sensible à la casse.

Nous utilisons echo insérer 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 'call me Ishmael.' | 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 le -t (tronquer). Cela remplace uniquement les caractères contenus dans le jeu un qui ont un caractère correspondant dans le jeu deux.

echo 'call me Ishmael.' | 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, [a-z] représente toutes les lettres minuscules, et [A-Z] 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 "How-To Geek" | tr '[a-z]' '[A-Z]'

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 "How-To Geek" | tr '[A-Z]' '[a-z]'

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 seulement.
  • [: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:]: Minuscules.
  • [:upper:]: Lettres capitales.

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

echo "How-To Geek" | tr '[:lower:]' '[:upper:]'
echo "How-To Geek" | tr '[:upper:]' '[:lower:]'

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

Inverser les correspondances

Le -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 trait d’union » -  » personnage.

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

On peut utiliser tr pour supprimer complètement les caractères, sans aucun remplacement.

Cette commande utilise le -d (supprimer) option 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 le -s (compression-répétition). 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 "a  b  c    de   f   c" | tr -s '[:blank:]'

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

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

Dans ce cas, on pourrait remplacer [:blank:] avec [:space:] et obtenir le même résultat.

echo "a  b  c     de   f   c" | tr -s '[:space:]'

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 apparents lorsque nous supprimons des caractères. Pour ce faire, nous utilisons le -d (supprimer) et fournissez un jeu de caractères qui tr recherchera dans son flux d’entrée. Tout ce qu’il trouve est supprimé.

echo "a  b  c     de   f   c" | 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 "a  b  c    de   f   c" | 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. Ceci est dû au fait [:space:] inclut les 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 "a  b  c    de   f   c" | 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.

echo abcd123efg | tr -d '[:digit:]'

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

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

echo abcd123efg | tr -cd '[:digit:]'

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

Notez que tout sauf les chiffres signifie toutes les lettres, et tous les espaces blancs, donc une fois de plus nous perdons la nouvelle 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 'one two three four' | 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 remplace les deux-points  » : » pour les espaces.

echo 'one two three four' | 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 côlon » : » sépare chaque chemin. Nous allons les changer en caractères de saut de ligne.

echo $PATH
echo $PATH | 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 intégrer cela dans tr et convertissez-le en une seule ligne.

cat files.txt
cat lines.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.

  • La première tr supprime tous les traits d’union « – » de l’entrée.
  • La 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 "Mangled FiLE-nAMe.txt" | tr -d '-' | tr -s ' ' | tr ' ' '_' | tr '[:upper:]' '[:lower:]'

Un pipeline de quatre instances de tr

Simple est aussi simple

Le tr La commande 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 méprenez 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 .

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

★★★★★