tr: convierte el apóstrofe a ASCII

tr: convierte el apóstrofe a ASCII

Estoy intentando convertir unComilla simple derechaa unaApóstrofeusando tr.

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

dado un archivo codificado en UTF-8 llamado aque contiene este ejemplo:

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

OS X usa BSD try produce un buen resultado:

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

Ubuntu usa GNU try produce este desagradable resultado:

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

¿Cómo puedo realizar esta conversión en Ubuntu?

Respuesta1

Podrías probar alguna otra herramienta, como sed:

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

O, como estamos haciendo una traducción simple, use el ycomando para sed:

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

ÑUtrno funciona presumiblemente porque:

Actualmente, trsolo admite caracteres de un solo byte. Con el tiempo admitirá caracteres multibyte; cuando lo haga, la -C opción hará que complemente el conjunto de caracteres, mientras que -c hará que complemente el conjunto de valores. Esta distinción sólo será importante cuando algunos valores no sean caracteres, y esto sólo es posible en configuraciones regionales que utilizan codificaciones multibyte cuando la entrada contiene errores de codificación.

Y es un carácter multibyte:

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

Respuesta2

Si también desea convertir las comillas dobles y quizás otros caracteres, puede usarÑUiconv:

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

El //TRANSLITsufijo indica iconvque para caracteres fuera del repertorio de la codificación de destino (aquí ASCII), puede sustituir automáticamente caracteres o secuencias de aspecto similar. Sin el sufijo, iconvse dará por vencido tan pronto como encuentre un carácter intraducible.

Tenga en cuenta que //TRANSLITparece ser una extensión GNU:POSIXiconvno lo soporta.

Respuesta3

Puede utilizar una de estas awksoluciones:

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

O

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

Respuesta4

Utilice -sla opción 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

información relacionada