2 votes

Pourquoi sed ne produit-il aucun texte ?

J'ai un fichier texte dont je dois supprimer les guillemets. J'ai trouvé cette qui suggérait d'utiliser les éléments suivants :

sed 's/"//g' < infile > outfile

Je comprends ce qu'il fait car je connais bien Vim. Mais le fichier de sortie contient zéro octet après l'exécution de la commande.

J'ai essayé l'autre suggestion de cette question :

tr -d \" < infile > outfile

Il en résulte une erreur :

tr: Illegal byte sequence

Notez que lorsque j'ouvre le fichier dans MacVim et que j'utilise

:%s /"//g

il fonctionne parfaitement.

Existe-t-il une différence entre le système d'information de MacOS et le système d'information de l'entreprise ? sed ? Avez-vous d'autres suggestions sur la façon de procéder ?

3voto

Gordon Davisson Points 30215

Apparemment, le fichier est au format UTF-16, mais la plupart des outils de manipulation de texte de MacOS ne savent pas comment travailler avec ce format et brouillent les fichiers s'ils essaient. Le format UTF-16 utilise deux octets par caractère ; pour les caractères ASCII simples tels que " Il s'agit du code ASCII d'un seul octet suivi d'un octet nul. Voici ce que cela donne tr -d \" supprimera le premier octet, laissant un octet nul et décalant tout le reste du fichier d'un octet.

Je pense qu'il est possible de faire fonctionner perl en UTF-16 (voir ici ), mais je ne suis pas sûr des tenants et aboutissants. Ce qui suit pourrait (sur la base de cette ):

perl -pe 'BEGIN { binmode $_, ":raw:encoding(UTF-16LE)" for *STDIN, *STDOUT }; s/"//g;' infile >outfile

Vous pouvez également le convertir en UTF-8 et inversement avec

iconv -f UTF-16LE -t UTF-8 infile | tr -d \" | iconv -f UTF-8 -t UTF-16LE >outfile

Si la sortie n'a pas besoin d'être en UTF-16, vous pouvez laisser la dernière valeur de iconv de l'extérieur.

2voto

Chuck Points 1620

Je ne sais pas exactement pourquoi ce problème se produit, mais j'ai trouvé un peu plus d'informations. ici y ici , qui n'ont pas fonctionné. Je pense qu'il s'agit de l'encodage et que l'option LC_CTYPE=C pourrait être sur la bonne voie, mais il a converti le texte en quelque chose de complètement différent à cause d'une sorte de problème d'encodage.

Quoi qu'il en soit, j'ai résolu le problème, du moins pour l'instant, avec ceci :

vim -c '%s /"//g|wq' infile

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X