69 votes

Comment supprimer ce symbole "^@" avec vim ?

J'ai quelques fichiers qui sont corrompus avec ce symbole :

^@

Il ne fait pas partie de la chaîne de caractères ; il ne peut pas être recherché. Comment puis-je substituer ce symbole par rien, ou comment puis-je supprimer ce symbole ?

Voici un exemple de ligne tirée d'un fichier :

^@F^@i^@l^@e^@n^@a^@m^@e^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@:^@ ^@^M^@

62voto

bitsprint Points 376

Vous pouvez essayer :

  • %s/<CTRL-2>//g (sur les PC ordinaires)

  • %s/<CTRL-SHIFT-2>//g (sur les PC Mac)

<CTRL-2> signifie qu'il faut d'abord appuyer sur la touche CTRL sur les PC normaux, en le maintenant enfoncé, en appuyant sur la touche 2 Communiqué de presse CTRL .

et <CTRL-SHIFT-2> signifie qu'il faut d'abord appuyer sur la touche control sur les PC Mac, en le maintenant comme enfoncé, enfoncé shift sur les PC Mac, en le maintenant enfoncé, appuyez sur 2 Communiqué de presse control y shift .

Enfin, les deux commandes devraient aboutir à %s/^@//g sur l'écran. ^@ signifie un seul caractère (un octet NULL, qui autrement ne pourrait pas être affiché), et non pas ^ suivi par @ donc vous ne pouvez pas simplement taper ^ y @ dans une rangée dans la commande ci-dessus.

Cette commande supprime tous les ^@ .

53voto

user11885 Points 166

Je ne pense pas que vos fichiers soient corrompus. La ligne de votre exemple semble contenir du texte normal avec des octets nuls entre chaque caractère. Cela suggère qu'il s'agit d'un fichier texte qui a été encodé en UTF-16 mais que la marque d'ordre des octets est manquante au début du fichier. Voir http://en.wikipedia.org/wiki/Byte-order_mark

Supposons que j'ouvre le Bloc-notes, que je tape le mot "nom de fichier" et que je l'enregistre en mode Unicode Big-endian. Un vidage hexadécimal de ce fichier ressemble à ceci :

fe ff 00 66 00 69 00 6c 00 65 00 6e 00 61 00 6d 00 65

Si j'ouvre ce fichier dans Vim, tout se passe bien : les octets "fe ff" indiquent à Vim comment le fichier est codé. Supposons maintenant que je crée un fichier contenant exactement la même séquence d'octets, mais sans le "fe ff" de tête. Vim insère ^@ (ou <00>, selon votre configuration), à la place des octets nuls ; Notepad insère des espaces.

Ainsi, plutôt que de supprimer les espaces vides, vous devriez plutôt chercher à faire en sorte que Vim interprète le fichier correctement. Vous pouvez faire en sorte que Vim recharge le fichier avec le bon encodage avec la commande :

:e ++enc=utf16

41voto

jriggins Points 521

Cela a fonctionné pour moi dans vim :

:%s/\%x00//g

13voto

pavium Points 6334

Ce "symbole" représente un caractère NULL, de valeur ASCII 000.

Il est difficile à supprimer avec vim, essayez de

tr -d '\000' < file1 > file2

8voto

TheAmigo Points 300

Comme d'autres l'ont noté, ce sont des octets nuls (ASCII 00). Sous Linux, la façon d'entrer des valeurs ASCII dans vim est d'appuyer sur Ctrl-V suivi de la valeur octale à 3 chiffres de n'importe quel caractère. Pour remplacer tous les octets nuls, utilisez :

    :%s/Ctrl-V000//g

(sans espace).

De même, vous pouvez rechercher des nuls avec :

    /Ctrl-V000

Dans les deux cas, il ne montrera pas les zéros pendant que vous les tapez, mais après avoir entré les trois, il affichera ^@ . Sur les terminaux couleur, il apparaîtra en bleu pour indiquer qu'il s'agit d'un caractère de contrôle.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X