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?

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top