Por que o sed falha com caracteres internacionais e como consertar?
-
09-06-2019 - |
Pergunta
GNU sed versão 4.1.5 parece falhar com caracteres internacionais.Aqui está meu arquivo de entrada:
Gras Och Stenar Trad - De Moja a Minneapolis DVD [G2007DVD] 7812 | X
GRAS OCH STENAR TRAD - De Möja a Minneapolis DVD [G2007DVD] 7812 | Y
(Observe o trema na segunda linha.)
E quando eu faço
sed 's /.* | // '<in
Eu esperaria ver apenas o X e Y, pois pedi para remover todos os caracteres até o '|' e espaço além dele.Em vez disso, recebo:
X
Gras Och Stenar Trad - De M?S
Eu sei que posso usar tr para remover os caracteres internacionais.primeiro, mas existe uma maneira de usar apenas o sed?
Solução
Acho que o erro ocorre se a codificação de entrada do arquivo for diferente da codificação preferida do seu ambiente.
Exemplo: in
é UTF-8
$ LANG=de_DE.UTF-8 sed 's/.*| //' < in
X
Y
$ LANG=de_DE.iso88591 sed 's/.*| //' < in
X
Y
UTF-8 pode ser interpretado com segurança como ISO-8859-1, você obterá caracteres estranhos, mas fora isso está tudo bem.
Exemplo: in
é ISO-8859-1
$ LANG=de_DE.UTF-8 sed 's/.*| //' < in
X
Gras Och Stenar Trad - From MöY
$ LANG=de_DE.iso88591 sed 's/.*| //' < in
X
Y
ISO-8859-1 não pode ser interpretado como UTF-8, a decodificação do arquivo de entrada falha.A estranha combinação provavelmente se deve ao fato de o sed tentar se recuperar em vez de falhar completamente.
A resposta é baseada no Debian Lenny/Sid e no sed 4.1.5.
Outras dicas
sed
não está muito bem configurado para texto não-ASCII.No entanto, você pode usar (quase) o mesmo código em perl
e obtenha o resultado desejado:
perl -pe 's/.*\| //' x