tr: converte apóstrofo para ASCII

tr: converte apóstrofo para ASCII

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 aque contém este exemplo:

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

OS X usa o BSD tre produz um bom resultado:

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

Ubuntu usa o GNU tre 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 ycomando para sed:

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

GNUtrnão funciona provavelmente porque:

Atualmente troferece 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 //TRANSLITsufixo informa iconvque 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, iconvdesistirá assim que encontrar um caracter intraduzível.

Observe que //TRANSLITparece ser uma extensão GNU:POSIXiconvnão suporta isso.

Responder3

Você pode usar uma destas awksoluçõ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 -sa 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

informação relacionada