![tr: converte apóstrofo para ASCII](https://rvso.com/image/977082/tr%3A%20converte%20ap%C3%B3strofo%20para%20ASCII.png)
Estou tentando converter umAspas simples à direitapara umApóstrofousando tr
.
tr "`echo -e '\xE2\x80\x99'`" "`echo -e '\x27'`" < a > b
dado um arquivo codificado em UTF-8 chamado a
que contém este exemplo:
We’re not a different species
“All alone?” Jeth mentioned.
OS X usa o BSD tr
e produz um bom resultado:
We're not a different species
“All alone?” Jeth mentioned.
Ubuntu usa o GNU tr
e produz este resultado desagradável:
We'''re not a different species
''<9C>All alone?''<9D> Jeth mentioned.
Como posso realizar essa conversão no Ubuntu?
Responder1
Você poderia tentar alguma outra ferramenta, como sed
:
$ sed "s/’/'/g" <a
We're not a different species
“All alone?” Jeth mentioned.
Ou, como estamos fazendo uma tradução simples, use o y
comando para sed
:
$ sed "y/’/'/" <a
We're not a different species
“All alone?” Jeth mentioned.
GNUtr
não funciona provavelmente porque:
Atualmente
tr
oferece suporte total apenas a caracteres de byte único. Eventualmente, ele suportará caracteres multibyte; quando isso acontecer, a-C
opção fará com que complemente o conjunto de caracteres, ao passo que-c
fará com que complemente o conjunto de valores. Essa distinção terá importância apenas quando alguns valores não forem caracteres, e isso só é possível em localidades que usam codificações multibyte quando a entrada contém erros de codificação.
E ’
é um caractere multibyte:
$ echo -n \' | wc -c
1
$ echo -n ’ | wc -c
3
Responder2
Se você também deseja converter aspas duplas e talvez outros caracteres, você pode usarGNUiconv
:
$ iconv -f utf-8 -t ascii//translit < a
We're not a different species
"All alone?" Jeth mentioned.
O //TRANSLIT
sufixo informa iconv
que para caracteres fora do repertório da codificação de destino (aqui ASCII), ele pode substituir automaticamente caracteres ou sequências de aparência semelhante. Sem o sufixo, iconv
desistirá assim que encontrar um caracter intraduzível.
Observe que //TRANSLIT
parece ser uma extensão GNU:POSIXiconv
não suporta isso.
Responder3
Você pode usar uma destas awk
soluções:
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
Responder4
Use -s
a opção 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