Comment utiliser la commande Linux tr
Publié: 2023-05-17Avez-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 ?
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'
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 'appelez-moi Ismaël.' | 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 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'
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]'
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]'
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 :]'
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' '-'
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' '-'
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'
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:]'
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:]'
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:]'
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:]'
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 ' '
Nous pouvons tout aussi facilement supprimer des chiffres.
écho abcd123efg | tr -d '[:chiffre:]'
En combinant les options -c
(compléter) et -d
(supprimer), nous pouvons tout supprimer sauf les chiffres.
écho abcd123efg | tr -cd '[:chiffre:]'
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'
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 ' ' ':'
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"
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' ' '
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 :]'
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
.
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
.