2008-09-15 8 views
15

GNU sed version 4.1.5 semble échouer avec les caractères internationaux. Voici mon fichier d'entrée:Pourquoi sed échoue avec les caractères internationaux et comment résoudre?

Gras Och Stenar Trad - De Moja à Minneapolis DVD [G2007DVD] 7812 | X
Gras Och Stenar Trad - Du Möja au Minneapolis DVD [G2007DVD] 7812 | Y

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

Et quand je

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

Je ne m'attendrais à voir que les X et Y, comme je l'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 enlever les caractères internationaux. d'abord, mais y a-t-il un moyen d'utiliser simplement sed?

+0

Ce problème semble avoir été résolu avec GNU sed (testé sur la version 4.2.2). – sorontar

Répondre

24

Je pense que l'erreur se produit si le codage d'entrée du fichier est différent de l'encodage 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é en toute sécurité ISO-8859-1, vous obtiendrez des personnages étranges, mais à part ça tout va bien.

Exemple: in 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ée comme UTF-8, à décoder le fichier d'entrée échoue. La correspondance étrange est probablement due au fait que sed essaie 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.

+0

Cela fonctionne aussi, et me permet d'utiliser sed. Merci! – Dave

9

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 
+0

Cet indice est très utile. –

Questions connexes