Identifier et supprimer les caractères nuls dans UNIX

j'ai un fichier texte contenant des caractères nuls non désirés (ASCII NUL, " 151900920" ). Quand j'essaie de le voir dans vi je vois les symboles ^@ , entrelacés dans un texte normal. Comment puis-je:

  1. identifier quelles lignes dans le fichier contiennent des caractères nuls? J'ai essayé de grêler pour " 151900920 " et x0 , mais cela n'a pas fonctionné.

  2. supprimer les caractères nuls? Exécuter strings sur le dossier a tout nettoyé, mais je me demande si c'est la meilleure façon?

68
demandé sur Tom Howard 2010-03-08 02:12:33

8 réponses

j'utiliserais tr :

tr < file-with-nulls -d '"151900920"0' > file-without-nulls

si vous vous demandez si la redirection d'entrée au milieu des arguments de commande fonctionne, elle fonctionne. La plupart des shells reconnaîtront et traiteront la redirection des e/s( < , > , ...) n'importe où dans la ligne de commande, en fait.

90
répondu Pointy 2014-01-27 03:06:52

utilisez la commande sed suivante pour supprimer les caractères nuls dans un fichier.

sed -i 's/\x0//g' null.txt

cette solution édite le fichier en place, important si le fichier est encore utilisé. passing-l'ext ' crée une sauvegarde du fichier original avec le suffixe 'ext' ajouté.

49
répondu rekha_sri 2012-10-08 16:12:03

un grand nombre de caractères NUL non désirés, disons un octet sur un autre, indique que le fichier est encodé en UTF-16 et que vous devez utiliser iconv pour le convertir en UTF-8.

16
répondu Ignacio Vazquez-Abrams 2010-03-07 23:16:06

j'ai découvert ce qui suit, qui imprime sur quelles lignes, le cas échéant, ont des caractères nuls:

perl -ne '/"151900920"0/ and print;' file-with-nulls

aussi, une décharge octale peut vous dire s'il y a des nulls:

od file-with-nulls | grep ' 000'
5
répondu dogbane 2010-03-08 08:08:31

si les lignes dans le fichier se terminent par \R\n\000 alors ce qui fonctionne est de supprimer le \N\000 puis de remplacer le \r par \N.

tr -d '\n"151900920"0' <infile | tr '\r' '\n' >outfile
5
répondu wwmbes 2015-11-24 10:41:58

voici un exemple comment supprimer les caractères nuls en utilisant ex (en place):

ex -s +"%s/\%x00//g" -cwq nulls.txt

et pour plusieurs fichiers:

ex -s +'bufdo!%s/\%x00//g' -cxa *.txt

pour la récursivité, vous pouvez utiliser option globbing **/*.txt (si elle est supportée par votre shell).

utile pour le script depuis sed et son paramètre -i 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?

2
répondu kenorb 2017-11-30 13:13:36

j'ai utilisé:

recode UTF-16..UTF-8 <filename>

pour se débarrasser des zéros dans le fichier.

1
répondu logisec 2016-12-17 13:00:49

j'ai fait face à la même erreur avec:

import codecs as cd
f=cd.open(filePath,'r','ISO-8859-1')

j'ai résolu le problème en changeant l'encodage utf-16

f=cd.open(filePath,'r','utf-16')
0
répondu Ming Young 2018-09-04 07:00:59