Sto cercando di convertire una virgoletta singola destra in un apostrofo usando tr
.
tr "`echo -e '\xE2\x80\x99'`" "`echo -e '\x27'`" < a > b
dato un file codificato UTF-8 chiamato a
che contiene questo esempio:
We're not a different species
“All alone?” Jeth mentioned.
OS X usa il BSD tr
e produce un bel risultato:
We're not a different species
“All alone?” Jeth mentioned.
Ubuntu usa GNU tr
e produce questo brutto risultato:
We'''re not a different species
''<9C>All alone?''<9D> Jeth mentioned.
Come posso realizzare questa conversione in Ubuntu?
Risposta accettata:
Potresti provare qualche altro strumento, come sed
:
$ sed "s/’/'/g" <a
We're not a different species
“All alone?” Jeth mentioned.
Oppure, dato che stiamo eseguendo una traduzione semplice, usa y
comando per sed
:
$ sed "y/’/'/" <a
We're not a different species
“All alone?” Jeth mentioned.
GNU tr
non funziona presumibilmente perché:
Attualmente tr
supporta completamente solo caratteri a byte singolo.
Alla fine supporterà caratteri multibyte; quando lo fa, il -C
opzione farà in modo che completi l'insieme di caratteri, mentre -c
lo farà integrare l'insieme di valori. Questa distinzione
avrà importanza solo quando alcuni valori non sono caratteri, e ciò è possibile
solo nelle impostazioni locali che utilizzano codifiche multibyte quando l'input contiene
errori di codifica.
E ’
è un carattere multibyte:
$ echo -n \' | wc -c
1
$ echo -n ’ | wc -c
3