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:
Ermitteln Sie, welche Zeilen in der Datei Nullzeichen enthalten. Ich habe Grepping für \0
und \x0
ausprobiert, aber das hat nicht funktioniert.
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.
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.
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.
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
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'
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.
Ich benutzte:
recode UTF-16..UTF-8 <filename>
nullen in der Datei loswerden.
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')