2008-09-15 20 views
15

GNU sed versión 4.1.5 parece fallar con caracteres internacionales. Aquí está mi archivo de entrada:¿Por qué sed falla con caracteres internacionales y cómo solucionarlo?

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

(Tenga en cuenta la diéresis en la segunda línea.)

Y cuando lo haga

sed 's /.* | // '< en

Esperaría ver solo la X y la Y, ya que he pedido eliminar TODOS los caracteres hasta el' | ' y el espacio más allá de eso. En cambio, obtengo:

X
Gras Och Stenar Trad - From M? Y

Sé que puedo usar tr para eliminar los caracteres internacionales. primero, pero ¿hay alguna manera de usar sed?

+0

Este problema parece que se ha resuelto con GNU sed (probado en la versión 4.2.2). – sorontar

Respuesta

24

Creo que el error se produce si la codificación de entrada del archivo es diferente de la codificación preferida de su entorno.

Ejemplo: in es UTF-8

$ LANG=de_DE.UTF-8 sed 's/.*| //' < in 
X 
Y 
$ LANG=de_DE.iso88591 sed 's/.*| //' < in 
X 
Y 

UTF-8 con seguridad se puede interpretar como ISO-8859-1, obtendrá caracteres extraños pero aparte de eso, todo está bien.

Ejemplo: in es 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 no se puede interpretar como UTF-8, decodificar el archivo de entrada falla. La extraña coincidencia se debe probablemente al hecho de que sed intenta recuperarse en lugar de fallar por completo.

La respuesta está basada en Debian Lenny/Sid y sed 4.1.5.

+0

Eso también funciona, y me permite usar sed. ¡Gracias! – Dave

9

sed no está muy bien configurado para texto no ASCII. Sin embargo se puede utilizar (casi) el mismo código en perl y obtener el resultado deseado:

perl -pe 's/.*\| //' x 
+0

Esta sugerencia es muy útil. –

Cuestiones relacionadas