tr: converte o apóstrofo em ASCII

11

Estou tentando converter uma Marca simples de aspas direita em um Apóstrofo usando 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% BSB% e produz um bom resultado:

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

O Ubuntu usa o GNU tr e produz esse resultado desagradável:

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

Como posso realizar essa conversão no Ubuntu?

    
por plamtrue 28.11.2014 / 02:32

4 respostas

16

Você pode tentar 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 comando y para sed :

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

GNU tr não funciona presumivelmente porque:

  

Atualmente, tr suporta totalmente apenas caracteres de byte único.   Eventualmente, ele suportará caracteres multibyte; quando isso acontece, o -C   A opção fará com que complemente o conjunto de caracteres, enquanto -c   fará com que complemente o conjunto de valores. Essa distinção   importa apenas quando alguns valores não são caracteres, e isso é possível   somente em locales usando 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
    
por muru 28.11.2014 / 02:40
9

Se você também quiser converter as aspas duplas e talvez outros caracteres, poderá usar GNU iconv :

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

O sufixo //TRANSLIT informa iconv que, para caracteres fora do repertório da codificação de destino (aqui ASCII), ele pode substituir automaticamente caracteres ou sequências semelhantes. Sem o sufixo, iconv desistirá assim que encontrar um caractere não traduzível.

Note que //TRANSLIT parece ser uma extensão do GNU: POSIX iconv não suporta.

    
por deltab 28.11.2014 / 06:03
3

Você pode usar uma dessas awk solutions:

awk '{gsub(/\xE2\x80\x99/, "\x27");print}' file # with Hex ASCII code

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

awk '{gsub(/201/, "");print}'  file # with Octal ASCII code

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

Ou

awk '{gsub(/’/, "'"'"'");print}' file
    
por αғsнιη 28.11.2014 / 10:23
0

Use a opção -s 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
    
por Skippy le Grand Gourou 28.11.2014 / 13:02