Estou tentando converter um aspas simples para 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.
O OS X usa o BSD tr
e produz um bom resultado:
We're not a different species
“All alone?” Jeth mentioned.
O 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?
echo It’s easy | perl -CS -Mutf8 -pe "tr/’/'/"
Respostas:
Você pode tentar outra ferramenta, como
sed
:Ou, como estamos fazendo uma tradução simples, use o
y
comando parased
:O GNU
tr
não funciona presumivelmente porque:E
’
é um caractere multibyte:fonte
sed
é muito melhor para esse tipo de trabalho.tr
está substituindo cada um dos três bytes separadamente por'
, portanto'''
, assim como as seqüências quebradas em que ele substituiu dois dos três bytes nos caracteres semelhantes“
e”
. Em vez disso, deve entender os três bytes como juntos, significando um caractere e substituí-lo.’
é um caractere multibyte e também podemos usar otr -c '[:print:][:cntrl:]' '-'
comando para substituir todos os caracteres não imprimíveis , exceto os caracteres de controle válidos, por a-
. E você verá uma’
tradução simples para 3 bytes de caracteres como---
. bom ponto para caracteres de vários bytes.Se você também deseja converter aspas duplas e talvez outros caracteres, use o GNU
iconv
:O
//TRANSLIT
sufixo informaiconv
que, para caracteres fora do repertório da codificação de destino (aqui ASCII), ele pode substituir automaticamente caracteres ou seqüê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 do GNU: o POSIXiconv
não suporta.fonte
Você pode usar uma destas
awk
soluções:Ou
fonte
Use a
-s
opção detr
:De
man tr
:fonte