web-dev-qa-db-fra.com

tr: convertit une apostrophe en ASCII

J'essaie de convertir un guillemet simple à droite en un Apostrophe en utilisant tr.

tr "`echo -e '\xE2\x80\x99'`" "`echo -e '\x27'`" < a > b

donné un fichier codé UTF-8 appelé a qui contient cet exemple:

We’re not a different species
“All alone?” Jeth mentioned.

OS X utilise BSD tr et produit un résultat de Nice:

We're not a different species
“All alone?” Jeth mentioned.

Ubuntu utilise le GNU tr et produit ce résultat désagréable:

We'''re not a different species
''<9C>All alone?''<9D> Jeth mentioned.

Comment puis-je accomplir cette conversion dans Ubuntu?

11
plamtrue

Vous pouvez essayer un autre outil, comme sed:

$ sed "s/’/'/g" <a
We're not a different species
“All alone?” Jeth mentioned.

Ou, puisque nous effectuons une traduction simple, utilisez la commande y pour sed:

$ sed "y/’/'/" <a
We're not a different species
“All alone?” Jeth mentioned.

GNU tr ne fonctionne probablement pas car:

Actuellement, tr ne prend entièrement en charge que les caractères à un octet. Finalement, il supportera les caractères multi-octets; quand c'est le cas, l'option -C le fera compléter le jeu de caractères, alors que -c le fera compléter le jeu de valeurs. Cette distinction importera uniquement lorsque certaines valeurs ne sont pas des caractères, ce qui n'est possible que dans les paramètres régionaux utilisant des codages multi-octets lorsque l'entrée contient des erreurs de codage.

Et est un caractère multi-octets:

$ echo -n \' | wc -c
1
$ echo -n ’ | wc -c  
3
16
muru

Si vous voulez également convertir les guillemets, et peut-être d'autres caractères, vous pouvez utiliser GNU iconv :

$ iconv -f utf-8 -t ascii//translit < a
We're not a different species
"All alone?" Jeth mentioned.

Le suffixe //TRANSLIT indique à iconv que, pour les caractères extérieurs au répertoire du codage cible (ici ASCII), il peut remplacer automatiquement des caractères ou des séquences similaires. Sans le suffixe, iconv abandonnera dès qu'il trouvera un caractère intraduisible.

Notez que //TRANSLIT semble être une extension GNU: POSIX iconv ne la prend pas en charge.

9
deltab

Vous pouvez utiliser l'une de ces solutions awk:

awk '{gsub(/\xE2\x80\x99/, "\x27");print}' file # with Hex ASCII code

awk '{gsub(/’/, "\x27");print}' file

awk '{gsub(/\342\200\231/, "\47");print}'  file # with Octal ASCII code

awk '{gsub(/’/, "\47");print}' file

Ou

awk '{gsub(/’/, "'"'"'");print}' file
3
αғsнιη

Utilisez l’option -s de tr:

$ echo "We’re not a different species"|tr -s "’" "'"
We're not a different species

De man tr:

--truncate-set1
          first truncate SET1 to length of SET2
0