![tr: convierte el apóstrofe a ASCII](https://rvso.com/image/977082/tr%3A%20convierte%20el%20ap%C3%B3strofe%20a%20ASCII.png)
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 a
que contiene este ejemplo:
We’re not a different species
“All alone?” Jeth mentioned.
OS X usa BSD tr
y produce un buen resultado:
We're not a different species
“All alone?” Jeth mentioned.
Ubuntu usa GNU tr
y 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 y
comando para sed
:
$ sed "y/’/'/" <a
We're not a different species
“All alone?” Jeth mentioned.
ÑUtr
no funciona presumiblemente porque:
Actualmente,
tr
solo 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 //TRANSLIT
sufijo indica iconv
que 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, iconv
se dará por vencido tan pronto como encuentre un carácter intraducible.
Tenga en cuenta que //TRANSLIT
parece ser una extensión GNU:POSIXiconv
no lo soporta.
Respuesta3
Puede utilizar una de estas awk
soluciones:
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 -s
la 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