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^@

6voto

rpyzh Points 163

Pour information, dans mon cas, j'ai dû utiliser vim sous cygwin pour modifier un fichier texte créé sur un mac. La solution proposée n'a pas fonctionné pour moi, mais elle était proche. D'après Page wiki de Vim sur le travail avec Unicode Il y a une différence entre les versions Big Endian et Little Endian de l'octet de la nomenclature. J'ai donc dû dire explicitement à vim pour 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 de fichier (fins de lignes) en dos pour que je puisse éditer le fichier dans l'éditeur Windows. Essayer de réinitialiser le format du fichier avant de spécifier l'encodage m'a donné du fil à retordre. Voici la liste complète des commandes que j'ai utilisées :

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

3voto

We Are All Monica Points 323

La solution acceptée n'a pas fonctionné pour moi. J'ai fait en sorte que vim fasse passer le fichier par tr à la place :

:%!tr -d '\000'

Cela fonctionnerait aussi très bien avec le mode visuel (il suffit de taper :!tr -d '\000' ) ou sur une série de lignes :

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

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

2voto

user490343 Points 21

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

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

Le caractère ^M est présent dans les données de votre exemple

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

dos2unix filename - rhel et autres

dos2ux filename [newfilename] - HP-UX

1voto

Alastair Points 191

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

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

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

Si BOM existe, alors 'lire le codage des caractères du fichier à partir de BOM'.

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

*- en fait, ^@ est le caractère de nouvelle ligne dans le texte de la mémoire tampon de Vim, et non le caractère Nul.

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

0voto

forlorn Points 1

Si vous êtes ici pour supprimer un autre personnage jeter un coup d'œil . Essayez ceci :

sed 's/;*$//g' <file1> file2

s/ signifie document entier

; est le texte à rechercher. vous pouvez le remplacer par votre caractère ou votre regex

*$ signifie le dernier caractère de la ligne. Vous pouvez utiliser votre propre regex ici.

//g signifie remplacer par rien, ici aussi vous pouvez utiliser votre regex.

< fichier d'entrée

'>'fichier de sortie

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