Estoy tratando de convertir una comilla simple a un apóstrofe usando tr
.
tr "`echo -e '\xE2\x80\x99'`" "`echo -e '\x27'`" < a > b
dado un archivo codificado UTF-8 llamado a
que contiene este ejemplo:
We’re not a different species
“All alone?” Jeth mentioned.
OS X usa el 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 lograr esta conversión en Ubuntu?
echo It’s easy | perl -CS -Mutf8 -pe "tr/’/'/"
Respuestas:
Puedes probar alguna otra herramienta, como
sed
:O, como estamos haciendo una traducción simple, use el
y
comando parased
:GNU
tr
no funciona presumiblemente porque:Y
’
es un personaje multibyte:fuente
sed
es mucho mejor para este tipo de trabajo.tr
está reemplazando cada uno de los tres bytes por separado con'
, por'''
lo tanto , así como las secuencias rotas donde ha reemplazado dos de los tres bytes en los caracteres similares“
y”
. En su lugar, debe comprender los tres bytes como si significaran un carácter, y reemplazarlos en su lugar.’
es un carácter multibyte, también podemos usar eltr -c '[:print:][:cntrl:]' '-'
comando para reemplazar todos los caracteres que no se imprimen , que no sean caracteres de control válidos, con a-
. Y verá una’
traducción única a 3 bytes de caracteres como---
. Buen punto para el carácter de varios bytes.Si también desea convertir las comillas dobles, y quizás otros caracteres, puede usar GNU
iconv
:El
//TRANSLIT
sufijo diceiconv
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, seiconv
rendirá tan pronto como encuentre un personaje intraducible.Tenga en cuenta que
//TRANSLIT
parece ser una extensión de GNU: POSIXiconv
no lo admite.fuente
Puede usar una de estas
awk
soluciones:O
fuente
-s
Opción de uso detr
:De
man tr
:fuente