webentwicklung-frage-antwort-db.com.de

Identifizieren und Entfernen von Nullzeichen in UNIX

Ich habe eine Textdatei, die unerwünschte Nullzeichen enthält (ASCII NUL, \0). Wenn ich versuche, es in vi anzuzeigen, sehe ich ^@-Symbole, die in normalem Text verschachtelt sind. Wie kann ich:

  1. Ermitteln Sie, welche Zeilen in der Datei Nullzeichen enthalten. Ich habe Grepping für \0 und \x0 ausprobiert, aber das hat nicht funktioniert.

  2. Entfernen Sie die Nullzeichen? Durch Ausführen von strings für die Datei wurde die Datei bereinigt. Ich frage mich nur, ob dies der beste Weg ist.

71
dogbane

Ich verwende tr:

tr < file-with-nulls -d '\000' > file-without-nulls

Wenn Sie sich fragen, ob die Umleitung von Eingaben in der Mitte der Befehlsargumente funktioniert, ist dies der Fall. Die meisten Shells erkennen und behandeln die E/A-Umleitung (<, >,…) überall in der Befehlszeile.

95
Pointy

Verwenden Sie den folgenden Befehl sed, um die Nullzeichen in einer Datei zu entfernen.

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

diese Lösung bearbeitet die Datei an Ort und Stelle. Dies ist wichtig, wenn die Datei noch verwendet wird. Durch Übergeben von -i'ext wird eine Sicherungskopie der Originaldatei mit dem Zusatz "ext" erstellt.

52
rekha_sri

Eine große Anzahl unerwünschter NUL-Zeichen, beispielsweise jedes zweite Byte, zeigt an, dass die Datei in UTF-16 codiert ist und dass Sie iconv verwenden müssen, um sie in UTF-8 zu konvertieren.

Wenn die Zeilen in der Datei mit\r\n\000 enden, müssen Sie\n\000 löschen und\r durch\n ersetzen.

tr -d '\n\000' <infile | tr '\r' '\n' >outfile
5
wwmbes

Ich entdeckte Folgendes, bei dem gedruckt wird, welche Zeilen, sofern vorhanden, Nullzeichen haben:

Perl -ne '/\000/ and print;' file-with-nulls

Ein Oktal-Dump kann auch feststellen, ob es Nullen gibt:

od file-with-nulls | grep ' 000'
5
dogbane

Beispiel: Entfernen von NULL-Zeichen mithilfe von ex (in-place):

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

und für mehrere Dateien:

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

Zur Rekursivität können Sie die Option globbing**/*.txt verwenden (sofern dies von Ihrer Shell unterstützt wird).

Nützlich für das Scripting, da sed und sein -i-Parameter eine nicht standardmäßige BSD-Erweiterung ist.

Siehe auch: Wie kann ich prüfen, ob es sich bei der Datei um eine Binärdatei handelt, und alle Dateien lesen, die keine sind?

2
kenorb

Ich benutzte:

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

nullen in der Datei loswerden.

1
logisec

Ich hatte den gleichen Fehler mit:

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

Ich habe das Problem gelöst, indem ich die Kodierung in utf-16 geändert habe.

f=cd.open(filePath,'r','utf-16')
0
Ming Young