Archives par mot-clé : chars

Remplacer des caractères spéciaux avec sed

Sid - © Blue Sky Studios
Sid – © Blue Sky Studios

Mais non pas Sid ! « sed » le petit programme sympa qui permet de faire des traitements sur du texte !

Un problème courant est d’avoir des caractères indésirables dans un fichier texte, qu’il s’agisse de données, d’un code source ou d’une page Web. Il arrive même qu’on ait affaire à des caractères ne s’affichant pas correctement, ou bien qui empêchent carrément le fonctionnement d’un logiciel.

Connaître le code hexadécimal des caractères avec « od »

Aujourd’hui tout le monde devrait utiliser l’encodage UTF-8. Dans les faits, c’est très loin d’être le cas : il faut souvent faire avec l’existant (Windows-1258, ISO-8859-*…), et l’UTF-8 ne couvrant pas tous les caractères possibles et imaginables, on peut aussi tomber sur des trucs exotiques issus de l’UTF-16 ou l’UTF-32.

Pour convertir un caractère spécial, une solution générique consiste à d’abord connaître son code hexadécimal (on devrait peut-être même dire « ses codes hexadécimaux » étant donné que ces caractères spéciaux sont encodés sur plusieurs octets). C’est un peu roots, mais ça aura le mérite de fonctionner dans n’importe quel shell de n’importe quel environnement.

Prenons par exemple le caractère €, et voyons à quoi il ressemble avec l’aide de la commande « od » :

printf '€' | od -vAn -tx1
 e2 82 ac

C’est donc cette suite de codes hexadécimaux que nous allons fournir à sed, moyennant une écriture légèrement différente puisque chaque code sera écrit de la forme \x??.

Cas des caractères qu’on n’arrive pas à taper au clavier ou à afficher

Certains caractères peuvent être particulièrement problématiques quand on souhaite connaître leurs codes hexadécimaux, tout simplement parce qu’on ne parvient pas à les taper au clavier, voire à les copier-coller. Dans ce cas, le mieux est d’isoler ces caractères dans un tout petit fichier texte et d’analyser les caractères avec od :

cat analyse.txt | od -vAn -tx1
 31 32 33 2e 34 35 20 e2 82 ac 20 54 54 43

Conversion des codes hexadécimaux avec sed

Maintenant que nous connaissons les caractères que nous souhaitons supprimer/modifier/remplacer (rayer les mentions inutiles), nous pouvons commencer par tester la commande sed avec les codes hexadécimaux :

echo '€' | sed 's/\xe2\x82\xac/\€/'
€

Dans l’exemple ci-dessus, les apostrophes (« simples quotes ») permettent de ne pas échapper les codes hexadécimaux ; mais cette autre écriture est tout à fait équivalente :

echo '€' | sed s/\\xe2\\x82\\xac/'\€'/
€

Il faut toutefois souligner que dans le cas présent, où l’on va remplacer le symbole € par son entité HTML, il est indispensable que l’entité soit d’une part entre apostrophes, d’autre part que le caractère & soit échappé avec un antislash. Ceci vient du fait que sed interprète par défaut & comme une recopie sur la sortie du motif trouvé… Et à ceci s’ajoute le shell qui interprète lui aussi ce caractère !

Remplacer plusieurs caractères spéciaux

Avec l’argument « -r » passé à sed, il est également possible de remplacer plusieurs motifs par quelque chose, en séparant ces motifs par « | » (la joie des expressions régulières ! :mrgreen:). Par exemple, si l’on souhaite changer tous les E accentués d’un texte (ÉÈÊË) en E, il suffit de faire :

sed -r s/\\xc3\\x89\|\\xc3\\x88\|\\xc3\\x8b\|\\xc3\\x8a/E/g origine.txt > resultat.txt

Voilà tout !