Wie entferne ich dieses Symbol "^ @" mit vim?

58493
mrt181

Ich habe einige Dateien, die mit diesem Symbol beschädigt sind:

^ @

Es ist nicht Teil der Zeichenfolge. es ist nicht durchsuchbar. Wie ersetze ich dieses Symbol durch nichts oder wie lösche ich dieses Symbol?

Hier ist eine Beispielzeile aus einer Datei:

^@F^@i^@l^@e^@n^@a^@m^@e^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@:^@ ^@^M^@ 
50

9 Antworten auf die Frage

46
jrb

Ich glaube nicht, dass Ihre Dateien beschädigt sind. Ihre Beispielzeile sieht so aus, als ob sie regulären Text mit null Bytes zwischen den einzelnen Zeichen enthält. Dies deutet darauf hin, dass es sich um eine Textdatei handelt, die in UTF-16 codiert wurde, die Bytereihenfolge fehlt jedoch am Anfang der Datei. Siehe http://en.wikipedia.org/wiki/Byte-order_mark

Angenommen, ich öffne den Editor, gebe das Wort "Dateiname" ein und speichere es als Unicode Big-Endian. Ein Hex-Dump dieser Datei sieht folgendermaßen aus:

fe ff 00 66 00 69 00 6c 00 65 00 6e 00 61 00 6d 00 65

Wenn ich diese Datei in Vim öffne, sieht es gut aus - die 'Fe ff'-Bytes sagen Vim, wie die Datei codiert ist. Nehmen wir an, ich erstelle eine Datei, die genau dieselbe Folge von Bytes enthält, jedoch ohne das führende 'fe ff'. Vim fügt anstelle der Nullbytes ^ @ (oder <00>, abhängig von Ihrer Konfiguration) ein. Notizblock fügt Leerzeichen ein.

Anstatt also die Nullen zu entfernen, sollten Sie wirklich darauf achten, dass Vim die Datei korrekt interpretiert. Sie können Vim mit dem Befehl dazu bringen, die Datei mit der richtigen Kodierung neu zu laden:

:e ++enc=utf16

Ja, der letzte Befehl hat dazu geführt, dass vim die Datei richtig interpretiert, die Nullbytes jedoch nicht entfernt. mrt181 vor 14 Jahren 0
Um sie zu entfernen, wählen Sie eine andere Kodierung und speichern Sie die Datei erneut: set fenc = utf-8 scy vor 14 Jahren 6
46
phresus

Du könntest es versuchen:

  • %s/<CTRL-2>//g (auf normalen PCs)

  • %s/<CTRL-SHIFT-2>//g (auf Mac PCs)

wo <CTRL-2>eine erste Einrichtung nach unten drücken, die CTRLauf normalen PCs, es halten wie nach unten gedrückt wird, drücken 2, loslassen CTRL.

und <CTRL-SHIFT-2>bedeutet control, dass Sie zuerst auf Mac-PCs die Taste gedrückt halten, die Taste gedrückt halten, shiftauf die Mac-PCs drücken, die Taste gedrückt halten, schlagen 2, loslassen controlund shift.

Schließlich sollten beide Befehle %s/^@//gauf dem Bildschirm angezeigt werden. ^@bedeutet ein einzelnes Zeichen (ein NULL - Byte, die sonst nicht angezeigt werden), nicht ^gefolgt @, so dass Sie geben nicht nur kann ^und @eine Zeile in in dem obigen Befehl.

Dieser Befehl entfernt alle ^@.

dies entfernt die nullbytes, danke mrt181 vor 14 Jahren 2
Ich bin gerade über diese Frage / Antwort über einen verwandten Link gestolpert: Dies ist eigentlich ein schlechter Ratschlag und funktioniert nur in wenigen Fällen richtig. Es ist besser, die Kodierung tatsächlich zu ändern, als Nullbytes zu entfernen. Wenn Sie die Null-Bytes entfernen, verfügen Sie möglicherweise noch über andere Multibyte-Zeichen, die als Abfall angezeigt werden. Mario vor 10 Jahren 3
@Mario Kannst du uns mehr über die Kodierungsänderung erzählen? Ist es etwas mit jrbs Antwort unten? George vor 10 Jahren 0
Siehe die Antwort von rpyzh weiter unten. Zeigt an, dass die Datei mit der richtigen Kodierung geladen und mit einer anderen gespeichert wird (obwohl für die Antwort möglicherweise weitere Erklärungen erforderlich sind). Jrbs letzte Notiz reicht aus, wenn Sie es nur lesen möchten, aber nicht, wenn Sie es ohne die Nullbytes mit einer anderen Kodierung speichern möchten. Mario vor 10 Jahren 0
28
jriggins

Das hat tatsächlich für mich in vim funktioniert:

:%s/\%x00//g 
das funktioniert mit substitute (), aber Ctl-VCtl-Shift-2 nicht. dsummersl vor 11 Jahren 4
Dasselbe Problem für mich, ich konnte nicht bekommen(sowie das mit ``) um zu arbeiten, aber das hat funktioniert. Jeff Bridgman vor 11 Jahren 0
Das funktioniert bei mir Linux. '00' ist der ASCII-Hexadezimalwert, den Sie für jedes Zeichen in vim finden können, indem Sie den Cursor darüber setzen und 'ga' eingeben (denken Sie "get ascii") im Befehlsmodus oder: / / ascii in der Befehlszeile. Http : //vim.wikia.com/wiki/Showing_the_ASCII_value_of_the_current_character Casey Jones vor 10 Jahren 3
^ Vx00 funktioniert auch. Mit ^ VuXXXX können Sie auch einen 16-Bit-Unicode eingeben. Ich habe \% uXXXX bei einer Suche ausprobiert und das hat auch funktioniert. Edward Falk vor 8 Jahren 0
11
pavium

Dieses 'Symbol' steht für ein NULL-Zeichen mit dem ASCII-Wert 000.

Es ist schwierig mit vim zu entfernen, versuchen Sie es

tr -d '\000' < file1 > file2 
6
rpyzh

FWIW, in meinem Fall musste ich vim auf cygwin verwenden, um eine auf einem Mac erstellte Textdatei zu bearbeiten. Die akzeptierte Lösung hat für mich nicht funktioniert, war aber knapp. Laut der Vim-Wiki-Seite zum Arbeiten mit Unicode gibt es einen Unterschied zwischen Big Endian- und Little Endian-Versionen des BOM-Bytes. Also musste ich explizit sagen vim, dass eine Little Endian-Version der Stücklistenverschlüsselung verwendet werden soll.

Erst nachdem ich die richtige Kodierung ausgewählt hatte, konvertierte ich das Dateiformat (Zeilenenden) in, dosdamit ich die Datei im Windows-Editor bearbeiten konnte. Der Versuch, das Dateiformat zurückzusetzen, bevor die Kodierung angegeben wurde, bereitete mir Leid. Hier ist die vollständige Liste der Befehle, die ich verwendet habe:

:e ++enc=utf16le :w! :e ++ff=mac :setlocal ff=dos :wq 
Wertvolle Infos. In meinem Fall war es das Ende des BOM-Bytes. Andre Albuquerque vor 10 Jahren 0
5
TheAmigo

Wie bereits erwähnt, handelt es sich hierbei um Null-Bytes (ASCII 00). Unter Linux können Sie ASCII-Werte in vim eingeben, indem Sie die Tastenkombination Strg-V und dann den dreistelligen Oktalwert eines beliebigen Zeichens drücken. Um alle Nullbytes zu ersetzen, verwenden Sie:

    :%s/Ctrl-V000//g

(ohne Leerzeichen).

Ebenso können Sie nach Nullen suchen mit:

    /Ctrl-V000

In beiden Fällen werden die Nullen bei der Eingabe nicht angezeigt, aber nachdem Sie alle drei eingegeben haben, werden sie angezeigt ^@. Bei Farbterminals wird dies in Blau angezeigt, um anzuzeigen, dass es sich um ein Steuerzeichen handelt.

3
jnylen

The accepted solution did not work for me. I made vim pipe the file through tr instead:

:%!tr -d '\000' 

This would also work well with visual mode (just type :!tr -d '\000') or on a range of lines:

# Remove nulls from current line: :.!tr -d '\000' # Remove nulls from lines 3-5: :3,5!tr -d '\000' 
2
user490343

^@ kein schlechtes Zeichen, wenn Sie eine korrekte Kodierung verwenden, aber wenn Sie sie entfernen möchten, versuchen Sie Folgendes:

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

^ Das Zeichen M ist in Ihren Beispieldaten enthalten

Versuchen Sie Folgendes, um Ihre Datei vor der Verarbeitung in das Unix / Linux-Format zu konvertieren:

dos2unix filename - Rhel und andere

dos2ux filename [newfilename] - HP-UX

1
colemik

Zusätzlich zur Antwort von @ jrb wird in Vim die Zeichenkodierung der Datei basierend auf der Option fileencodings ermittelt. (Beachten Sie das 's' am Ende von Fileencodings)

Das heißt, unter Windows ist der Standardwert für die fileencodingsOption ucs-bom:

Prüfen Sie, ob Stückliste am Anfang der Datei vorhanden ist.

Wenn eine Stückliste vorhanden ist, "lesen Sie die Zeichenkodierung der Datei aus der Stückliste".

Wenn keine Stückliste vorhanden ist (und in diesem Fall würde dies auch bedeuten, dass alle in der fileencodingsOption angegebenen Zeichencodierungen nicht übereinstimmen), lesen Sie die Datei mit der in der encodingOption angegebenen Zeichencodierung . Die Standard - Zeichencodierung für die encodingOption ist: latin1. Nun, da latin1die Ein - Byte - Länge - Zeichencodierung, alle Bytes in der Datei gültig sind latin1Zeichen (auch die NulZeichen, ^@die Sie sehen *).

* - ist eigentlich ^@das Newline-Zeichen im Zwischenspeicher des Vim, nicht das Nul-Zeichen.

Die richtige Methode zum Lesen der Datei besteht darin, die Zeichenkodierung manuell als UTF-16 anzugeben (da es so aussieht, als sei UTF-16 in diesem Fall die richtige Zeichenkodierung).