web-dev-qa-db-fra.com

Comment supprimer ce symbole "^ @" avec vim?

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

^ @

Cela ne fait pas partie de la ficelle; ce n'est pas consultable. Comment remplacer ce symbole par rien ou comment supprimer ce symbole?

Voici un exemple de ligne d'un fichier:

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

Tu pourrais essayer:

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

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

<CTRL-2> signifie d'abord appuyer sur la CTRL sur des ordinateurs ordinaires, en le maintenant appuyé, appuyez sur 2, Libération CTRL.

et <CTRL-SHIFT-2> signifie que vous appuyez d’abord sur la control sur un PC Mac, en le maintenant enfoncé, appuyez shift sur un PC Mac, en le maintenant appuyé, appuyez sur 2, Libération control et shift.

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

Cette commande supprime tous les ^@.

48
phresus

Je ne pense pas que vos fichiers sont corrompus. Votre exemple de ligne ressemble à du texte normal avec des octets nuls entre chaque caractère. Cela suggère qu'il s'agit d'un fichier texte encodé au format 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, tape le mot 'nomfichier' et l'enregistre en tant que Big-endian Unicode. 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' initial. Vim insère ^ @ (ou <00>, selon votre configuration), à la place des octets nuls; Le bloc-notes insère des espaces.

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

:e ++enc=utf16

49
jrb

Cela a réellement fonctionné pour moi au sein de vim:

:%s/\%x00//g
34
jriggins

Ce 'symbole' représente un caractère NULL, avec ASCII valeur 000.

C'est difficile à enlever avec vim, essayez

tr -d '\000' < file1 > file2
12
pavium

FWIW, dans mon cas, j’ai dû utiliser vim on cygwin pour éditer un fichier texte créé sur un mac. La solution acceptée ne fonctionnait pas pour moi, mais était proche. Selon la page wiki de Vim concernant l'utilisation de Unicode , il existe une différence entre les versions Big Endian et Little Endian de l'octet de nomenclature. Donc, je devais explicitement dire à vim d'utiliser une version Little Endian de l'encodage de la nomenclature.

Ce n’est qu’après avoir choisi le bon encodage que j’ai converti le format du fichier (fins de ligne) en dos afin de pouvoir éditer le fichier dans l’éditeur Windows. Essayer de définir la réinitialisation du format de fichier avant de spécifier l'encodage m'a donné du chagrin. Voici la liste complète des commandes que j'ai utilisées:

:e ++enc=utf16le
:w!
:e ++ff=mac
:setlocal ff=dos
:wq
6
rpyzh

Comme d'autres l'ont noté, il s'agit d'octets nuls (ASCII 00). Sous Linux, pour entrer ASCII valeurs dans vim, vous devez appuyer sur Ctrl-V, suivi de la valeur octale à 3 chiffres de tout caractère. Pour remplacer tous les octets nuls, utilisez:

:%s/Ctrl-V000//g

(sans espaces).

De même, vous pouvez rechercher des valeurs NULL avec:

/Ctrl-V000

Dans les deux cas, les zéros ne seront pas affichés au fur et à mesure que vous les tapez, mais après avoir entré les trois, il affichera ^@. Sur les terminaux de couleur, il sera indiqué en bleu pour indiquer qu'il s'agit d'un caractère de contrôle.

6
TheAmigo

La solution acceptée ne fonctionnait pas pour moi. J'ai alors fait passer le fichier par vim via tr à la place:

:%!tr -d '\000'

Cela fonctionnerait aussi bien en mode visuel (tapez simplement :!tr -d '\000') ou sur une plage de lignes:

# Remove nulls from current line:
:.!tr -d '\000'

# Remove nulls from lines 3-5:
:3,5!tr -d '\000'
3
jnylen

^@ n'est pas un mauvais caractère si vous utilisez un encodage approprié, mais si vous voulez le supprimer, essayez alors:

  • tr -d '\000'
  • sed 's/\000//g'

^ M caractère est là dans vos données d'exemple

Pour convertir votre fichier au format Unix/Linux avant tout traitement, essayez:

dos2unix filename - rhel et autres

dos2ux filename [newfilename] - HP-UX

2
user490343

En plus de la réponse de @ jrb, dans Vim, le codage de caractères du fichier est détecté en fonction de l'option fileencodings. (notez le 's' à la fin du codage de fichier)

C'est à dire. sous Windows, la valeur par défaut de l'option fileencodings est ucs-bom, ce qui signifie:

vérifie si la nomenclature existe au début du fichier.

Si la nomenclature existe, "lisez le codage de caractères du fichier en dehors de la nomenclature".

Si la nomenclature n'existe pas (et dans ce cas, cela signifie également que tous les codages de caractères spécifiés dans l'option fileencodings ne correspondent pas), lisez le fichier avec le codage de caractères spécifié dans l'option encoding. Le codage de caractères par défaut pour l'option encoding est: latin1. Maintenant, parce que latin1 est le un octet codage de caractères de longueur, tous octets Le fichier contient des caractères latin1 valides (même le caractère Nul, ^@ que vous voyez *).

* - en fait, ^@ est le caractère de nouvelle ligne dans le texte du tampon de Vim, pas le caractère Nul.

La bonne façon de lire le fichier est de spécifier le codage de caractères manuellement en UTF-16 (car il semble que UTF-16 est le bon codage dans ce cas).

1
colemik