Pourquoi sed échoue-t-il avec les caractères internationaux et comment y remédier?
-
09-06-2019 - |
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?
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