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 tr
Les 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'
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'
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'
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'
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]'
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]'
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:]'
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' '-'
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' '-'
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'
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:]'
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:]'
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:]'
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:]'
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 ' '
Nous pouvons tout aussi facilement supprimer des chiffres.
echo abcd123efg | tr -d '[:digit:]'
En combinant le -c
(complément) et -d
(supprimer) options, nous pouvons tout supprimer sauf les chiffres.
echo abcd123efg | tr -cd '[:digit:]'
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'
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 ' ' ':'
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"
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' ' '
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:]'
EN RAPPORT: Comment utiliser les tubes sous Linux
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
.