J'ai un fichier texte contenant des caractères nuls indésirables (ASCII NUL, \0
). Lorsque j'essaye de l'afficher dans, vi
je vois des ^@
symboles entrelacés dans du texte normal. Comment puis-je:
Identifiez les lignes du fichier contenant des caractères nuls? J'ai essayé grepping pour
\0
et\x0
, mais cela n'a pas fonctionné.Supprimer les caractères nuls? L'exécution
strings
sur le fichier l'a nettoyé, mais je me demande simplement si c'est la meilleure façon?
unix
shell
null
special-characters
dogbane
la source
la source
Réponses:
J'utiliserais
tr
:Si vous vous demandez si la redirection d'entrée au milieu des arguments de commande fonctionne, c'est le cas. La plupart des shells reconnaîtront et faire face à la redirection d' E / S (
<
,>
...) partout dans la ligne de commande, en fait.la source
tr -d '\000' < file-with-nulls > file-without-nulls
car cela<
fait partie de la fonctionnalité du tube shell et nontr
.cat |
. Une solution fine et propre qui a résolu mon problème.Utilisez la commande sed suivante pour supprimer les caractères nuls dans un fichier.
cette solution édite le fichier en place, ce qui est important si le fichier est toujours utilisé. passer -i'ext 'crée une sauvegarde du fichier original avec le suffixe' ext 'ajouté.
la source
sed -i
nécessite une extension dans l'argument suivant, mais il peut être vide. Dans ces systèmes, ajoutez un''
, comme dans:sed -i '' 's/\x0//g "$FILE"
.tr
pour moi$ sed --version
->sed (GNU sed) 4.7
, j'ai dû utiliser l'invocation suivante pour obtenir un fichier de sauvegarde appeléexample.csv.bak
:sed -i.bak 's/\x0//g' example.csv
Un grand nombre de caractères NUL indésirables, disons un tous les autres octets, indique que le fichier est encodé en UTF-16 et que vous devez l'utiliser
iconv
pour le convertir en UTF-8.la source
iconv -f UTF-16 -t UTF-8 file
.J'ai découvert ce qui suit, qui affiche quelles lignes, le cas échéant, ont des caractères nuls:
De plus, un vidage octal peut vous dire s'il y a des valeurs nulles:
la source
Si les lignes du fichier se terminent par \ r \ n \ 000 alors ce qui fonctionne est de supprimer le \ n \ 000 puis de remplacer \ r par \ n.
la source
Voici un exemple de suppression des caractères NULL à l'aide de
ex
(in-place):et pour plusieurs fichiers:
Pour la récursivité, vous pouvez utiliser l' option de globbing
**/*.txt
(si elle est prise en charge par votre shell).Utile pour les scripts car
sed
et son-i
paramètre est une extension BSD non standard.Voir aussi: Comment vérifier si le fichier est un fichier binaire et lire tous les fichiers qui ne le sont pas?
la source
J'ai utilisé:
pour se débarrasser des zéros dans le fichier.
la source
J'ai fait face à la même erreur avec:
J'ai résolu le problème en changeant l'encodage en
utf-16
la source