Question

La version 4.1.5 de GNU sed semble échouer avec les caractères internationaux. Voici mon fichier d'entrée:

Gras Och Stenar Trad - De Moja à Minneapolis DVD [G2007DVD] 7812 | X
Gras Och Stenar Trad - De M & # 246; ja à Minneapolis DVD [G2007DVD] 7812 | Y

(Notez le tréma en deuxième ligne.)

Et quand je le fais

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

Je m'attendrais à ne voir que le X et le Y, car j'ai demandé de supprimer TOUS les caractères jusqu'au "|" et l'espace au-delà. Au lieu de cela, je reçois:

X
Gras Och Stenar Trad - De M? Y

Je sais que je peux utiliser tr pour supprimer les caractères internationaux. d’abord, mais y at-il un moyen d’utiliser simplement sed?

Était-ce utile?

La solution

Je pense que l'erreur se produit si le codage d'entrée du fichier est différent du codage préféré de votre environnement.

Exemple: in est UTF-8

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

UTF-8 peut être interprété comme ISO-8859-1, vous obtiendrez des caractères étranges, mais à part ça, tout va bien.

Exemple: <=> est 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 ne peut pas être interprété comme UTF-8, le décodage du fichier d'entrée échoue. La correspondance étrange est probablement due au fait que sed tente de récupérer plutôt que d’échouer complètement.

La réponse est basée sur Debian Lenny / Sid et sed 4.1.5.

Autres conseils

sed n'est pas très bien configuré pour le texte non-ASCII. Cependant, vous pouvez utiliser (presque) le même code dans perl et obtenir le résultat souhaité:

perl -pe 's/.*\| //' x
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top