Pregunta

La versión 4.1.5 de GNU sed parece fallar con los caracteres internacionales.Aquí está mi archivo 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

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

Y cuando lo hago

Sed 'S /.* | // '<en

Esperaría ver solo la X e Y, ya que he pedido que elimine todos los caracteres para el '|' y espacio más allá.En cambio, obtengo:

X
Gras Och Stenar Trad - De M?Y

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

¿Fue útil?

Solución

Creo que el error ocurre 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 se puede interpretar con seguridad como ISO-8859-1, obtendrás 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 y falla la decodificación del archivo de entrada.La extraña coincidencia probablemente se deba al hecho de que sed intenta recuperarse en lugar de fallar por completo.

La respuesta se basa en Debian Lenny/Sid y sed 4.1.5.

Otros consejos

sed no está muy bien configurado para texto que no sea ASCII.Sin embargo, puedes usar (casi) el mismo código en perl y obtenga el resultado que desea:

perl -pe 's/.*\| //' x
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top