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?
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
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.
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
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