2010-08-08 5 views
2

Dans un récent question, il a été noté que sur OSX, exécuter sed sur un fichier non ascii donnait des résultats étranges. Par exemple, si vous faites (/ usr/bin/cal est un fichier binaire aléatoire)Lang et sed sur OSX

sed 's/[^A-Z]//' /usr/bin/cal 

sed va supprimer tous les caractères imprimables autres que A-Z, mais beaucoup de caractères non imprimables restent. Si toutefois, vous faites

LANG='' sed 's/[^A-Z]//' /usr/bin/cal 

seuls A-Z (et les nouvelles lignes) sont sortis. Pourquoi?

Normalement LANG=en-US.UTF-8 Que se passe-t-il? Je ne vois pas de toute façon que la sortie de sed pourrait être considérée correcte en UTF-8. Est-ce cassé, ou y a-t-il une notion de travail que je ne comprends pas?

Je sais que l'OSX sed est conforme à POSIX, et est donc différent de l'appréciée GNU sed.

Répondre

3

données binaires, telles que le contenu de/usr/bin/cal, ne sont pas UTF-8, et ainsi confondront tout code qui se lit comme si elle était. En particulier, tout octet avec l'ensemble de bits élevé (par exemple,> = 128) sera interprété comme faisant partie d'une séquence multi-octets représentant un seul caractère, et sera ainsi éliminé de la sortie. Toutes les séquences d'octets avec l'ensemble de bits élevés ne sont pas valides UTF-8, donc les choses seront assez confuses, mais cela explique probablement pourquoi certains caractères non-imprimables restent mais (peut-être) pas d'autres. En bref: si vous souhaitez utiliser des outils orientés texte sur des données binaires, ne le faites pas.