Linux : Transformer les caractères d’un texte avec tr
I. Présentation
Comme j’ai horreur de répéter plus de cinq fois la même commande, il existe un outil que j’apprécie particulièrement dans l’environnement Linux en matière de modification de texte. Il s’agit de la commande tr. Dans ce billet, je vous propose de voir comment transformer un paragraphe ou un texte entier, en fonction d’un masque ou d’une casse particulière.
II. La commande
La commande tr (pour l’abrégé de translate) permet de convertir et/ou de supprimer des caractères depuis l’entrée standard stdin, tout en écrivant sur la sortie standard stdout. Cela en fait un outil très précieux pour la manipulation de chaîne de caractères.
Le profil de cette commande est le suivant :
$ tr <Option> [masqueInput] [masqueOutput]
Parmi les masques prédéfinis servant à effectuer les conversions, on peut ainsi utiliser (aussi bien entrée qu’en sortie) les mots-clés suivants :
- alnum: lettres et chiffres
- alpha: lettres
- blank: caractères d’espacement horizontaux
- cntrl: caractères de contrôle
- digit: chiffres
- graph: caractères imprimables à l’exception de l’espace
- lower: lettres minuscules
- print: caractères imprimables y compris l’espace
- punct: caractères de ponctuation
- space: caractères d’espacement horizontaux ou verticaux
- upper: caractères majuscules
- xdigit: chiffres hexadécimaux
III. Exemples d'utilisation
Grâce à ce genre d’outil, on peut ainsi transformer une chaîne de caractères minuscules en majuscules. Prenons pour exemple la première phrase de texte de l’article Wikipédia concernant Linux:
"Linux est, au sens restreint, le noyau de système d'exploitation Linux, et au sens large, tout système d'exploitation fondé sur le noyau Linux. Cet article couvre le sens large."
Pour tester l’effet de la commande tr, nous allons rediriger cette phrase dans un fichier texte de la façon décrite ci-dessous :
$ cat "Linux est, au sens restreint, le noyau de système d'exploitation Linux, et au sens large, tout système d'exploitation fondé sur le noyau Linux. Cet article couvre le sens large." > Linux.txt
On peut alors transformer le texte contenu dans le fichier Linux.txt en majuscules :
$ cat Linux.txt | tr [:lower:] [:upper:]
REMARQUE: bien évidemment, on peut aussi réaliser ce genre de manipulation en remplaçant lettre à lettre les minuscules par des majuscules en exécutant l’instruction suivante:
$ cat Linux.txt | tr [a-z] [A-Z]
De la même façon imaginons une chaîne de caractère ‘aaabbccc’, si l’on souhaite supprimer les répétitions, il suffira juste d’exprimer la commande suivante :
$ echo ‘aaabbccc’ | tr –s [a-z]
Si l’on reprend l’exemple du fichier Linux.txt, il est également possible de supprimer les caractères d’espace au sein du texte contenu en exécutant la commande ci-dessous :
$ cat Linux.txt|tr –d ’ ’
On obtiendra alors le texte complet, mais sans espace aucun. Soit le résultat suivant :
"Linuxest,ausensrestreintlenoyaudesystèmed'exploitationLinuxetausenslarge,toutsystèmed'exploitationfondésur lenoyauLinux.Cetarticlecouvrelesenslarge."
REMARQUE: on peut notamment supprimer les caractères accentués dans un texte en utilisant la commande tr :
$ tr "àçéèêëîïôöùüÂÇÉÈÊËÎÏÔÖÙÜ" "aceeeeiioouuACEEEEIIOOUU"
IV. Conclusion
En jouant ainsi avec les masques prédéfinis et les différentes options de nombreuses manipulations peuvent être réalisées sans trop de difficulté et surtout avec un effort moindre de la part de l’administrateur. Certains me diront qu’avec sed, grep et awk on peut faire pareil. Certes, mais, personnellement, je trouve tr beaucoup plus facile à manipuler (et peut-être les commandes un peu plus courtes à écrire). Il existe de nombreuses autres possibilités que je vous laisse découvrir par vous-mêmes en consultant le manuel d’aide en ligne.
Certes, tr est plus simple, mais aussi bien plus limité (ça se limite au remplacement des caractères un à un notamment, dès qu’il s’agit de remplacer des mots, faut voir ailleurs). Et quand on fait du sed ou du awk à longueur de temps, par habitude, on ne pense pas forcément à tr pour les cas simples.
Bonsoir.
Oui, c’est vrai que c’est caractère pour caractère avec tr.
Mais, pour constituer des listes et les récupérer au travers de scripts en transformant les espaces par une virgule (ou l’inverse) tr s’avère l’outil idéal. D’autant qu’on peut jouer sur les caractères spéciaux, les chiffres et/ou les lettres.
En fait, j’ai (re)découvert tr à l’occasion de l’automatisation de mes scripts de découverte de supervision. Mais, je suis d’accord avec vous, à force de faire du awk, du grep ou du sed j’avais presque oublié cette petite commande somme toute pratique.