with tutorial regular online linux internationalization sed character

linux - tutorial - sed regex online



¿Por qué sed falla con caracteres internacionales y cómo solucionarlo? (2)

GNU sed versión 4.1.5 parece fallar con 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

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

Y cuando lo hago

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 - ¿De M? Y

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


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á 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, la decodificación del 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 se basa en Debian Lenny / Sid y sed 4.1.5.


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

perl -pe ''s/.*/| //'' x