BASH : Suppression des accents, cédilles, etc
Comment supprimer les accents, cédilles, etc, dans une chaine de caractères ?
Méthode classique : la substitution
La suppression des caractères accentués et autres cédilles peut être effectuée, en Bash, en utilisant « sed » ou « tr » :
fhh@aaricia ~ $ _str="Une chaine avec des é, des Ù, des À, des ç et des œ" fhh@aaricia ~ $ echo $_str | sed 'y/áàâäçéèêëîïìôöóùúüñÂÀÄÇÉÈÊËÎÏÔÖÙÜÑ/aaaaceeeeiiiooouuunAAACEEEEIIOOUUN/' Une chaine avec des e, des U, des A, des c et des œ
La méthode est fonctionnelle mais sous entend que tous les caractères à substituer aient été définis. Dans l’exemple, le « œ
» n’a pas été remplacé car aucun caractère de remplacement ne lui est alloué.
Autre problème de cette méthode, remplacer une lettre par deux autres tel que « œ
» par « oe
» ou le « ß
» allemand par « ss
» nécessite la définition de règles particulières à chaque cas.
Ce sont ces raisons qui nous poussent à éviter cette méthode au profit de la conversion de chaines de caractères.
Méthode recommandée : la conversion
Plus complète, la méthode de conversion présente en sus l’avantage d’être plus concise.
« iconv » est utilisé pour « convertir » la chaine de caractères du format de base, UTF-8 dans l’exemple (option « -f » pour « from »), vers le format ASCII (option « -t » pour « to »).
Avec l’option « TRANSLIT », si un caractère ne peut être transcrit dans le format de destination, il est converti en une chaine de caractère équivalente.
fhh@aaricia ~ $ _str="Une chaine avec des é, des Ù, des À, des çÇ et des œ" fhh@aaricia ~ $ echo $_str | iconv -f utf8 -t ascii//TRANSLIT Une chaine avec des e, des U, des A, des cC et des oe
La méthode fonctionne sur un large panel de caractères :
fhh@aaricia ~ $ echo "\"ß\"" | iconv -f utf8 -t ascii//TRANSLIT "ss" fhh@aaricia ~ $ echo "āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜĀÁǍÀĒÉĚÈĪÍǏÌŌÓǑÒŪÚǓÙǕǗǙǛ" | iconv -f utf8 -t ascii//TRANSLIT aaaaeeeeiiiioooouuuuuuuuAAAAEEEEIIIIOOOOUUUUUUUU
et peut être utilisée sur des fichiers :
fhh@aaricia ~ $ cat myfile.txt Une chaine avec des é, des Ù, des À, des ç et des œ et même des "ß" fhh@aaricia ~ $ iconv -f utf8 -t ascii//TRANSLIT < myfile.txt > noaccents.txt fhh@aaricia ~ $ cat noaccents.txt Une chaine avec des e, des U, des A, des c et des oe et meme des "ss"