it-swarm.com.de

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

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^@
57
mrt181

Du könntest es versuchen:

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

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

wobei <CTRL-2> bedeutet, dass Sie zuerst die Taste drücken CTRL auf normalen PCs gedrückt halten, drücken 2, Veröffentlichung CTRL.

und <CTRL-SHIFT-2> bedeutet, dass Sie zuerst die Taste drücken control Halten Sie bei Mac-PCs die Taste gedrückt und drücken Sie sie nach unten shift Halten Sie auf Mac-PCs die Taste gedrückt und drücken Sie 2, Veröffentlichung control und shift.

Schließlich sollten beide Befehle zu %s/^@//g auf dem Bildschirm führen. ^@ bedeutet ein einzelnes Zeichen (ein NULL-Byte, das sonst nicht angezeigt werden könnte), nicht ^, gefolgt von @. Sie können also im obigen Befehl nicht einfach ^ und @ in einer Zeile eingeben.

Dieser Befehl entfernt den gesamten ^@.

48
phresus

Ich glaube nicht, dass Ihre Dateien beschädigt sind. Ihre Beispielzeile sieht so aus, als ob sie normalen 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, aber die Markierung für die Bytereihenfolge am Anfang der Datei fehlt. Siehe http://en.wikipedia.org/wiki/Byte-order_mark

Angenommen, ich öffne Notepad, gebe den Wortnamen "filename" ein und speichere ihn 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 teilen Vim mit, wie die Datei codiert ist. Nehmen wir nun an, ich erstelle eine Datei, die genau die gleiche Folge von Bytes enthält, jedoch ohne das führende 'fe ff'. Vim fügt ^ @ (oder <00>, abhängig von Ihrer Konfiguration) anstelle der Null-Bytes ein. Notepad fügt Leerzeichen ein.

Anstatt also die Nullen zu entfernen, sollten Sie wirklich versuchen, Vim dazu zu bringen, die Datei richtig zu interpretieren. Sie können Vim veranlassen, die Datei mit der richtigen Codierung mit dem folgenden Befehl neu zu laden:

:e ++enc=utf16

49
jrb

Das funktionierte tatsächlich für mich in vim:

:%s/\%x00//g
34
jriggins

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
12
pavium

FWIW, in meinem Fall musste ich vim auf cygwin verwenden, um eine auf einem Mac erstellte Textdatei zu bearbeiten. Die akzeptierte Lösung hat bei mir nicht funktioniert, war aber nah. Laut der Vim-Wiki-Seite zum Arbeiten mit Unicode gibt es einen Unterschied zwischen der Big-Endian- und der Little-Endian-Version des BOM-Bytes. Also musste ich vim explizit anweisen, eine Little Endian-Version der Stücklistencodierung zu verwenden.

Erst nach Auswahl der richtigen Codierung habe ich das Dateiformat (Zeilenenden) in dos konvertiert, damit ich die Datei im Windows-Editor bearbeiten konnte. Der Versuch, das Dateiformat zurückzusetzen, bevor die Codierung angegeben wurde, machte mir Sorgen. Hier ist die vollständige Liste der Befehle, die ich verwendet habe:

:e ++enc=utf16le
:w!
:e ++ff=mac
:setlocal ff=dos
:wq
6
rpyzh

Wie andere angemerkt haben, sind dies Null-Bytes (ASCII 00). Unter Linux können Sie ASCII Werte in vim eingeben, indem Sie Strg-V gefolgt vom dreistelligen Oktalwert eines beliebigen Zeichens drücken. Verwenden Sie zum Ersetzen aller Nullbytes Folgendes:

:%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 nach Eingabe aller drei wird ^@ angezeigt. Auf den Farbterminals wird blau angezeigt, um anzuzeigen, dass es sich um ein Steuerzeichen handelt.

6
TheAmigo

Die akzeptierte Lösung hat bei mir nicht funktioniert. Stattdessen habe ich vim die Datei durch tr leiten lassen:

:%!tr -d '\000'

Dies funktioniert auch im visuellen Modus (geben Sie einfach :!tr -d '\000' ein) oder in einer Reihe von Zeilen:

# Remove nulls from current line:
:.!tr -d '\000'

# Remove nulls from lines 3-5:
:3,5!tr -d '\000'
3
jnylen

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

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

In Ihren Beispieldaten steht das Zeichen ^ M

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

dos2unix filename - rhel und andere

dos2ux filename [newfilename] - HP-UX

2
user490343

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

Das heißt Unter Windows lautet der Standardwert für die Option fileencodingsucs-bom. Dies bedeutet:

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

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

Wenn keine Stückliste vorhanden ist (und dies in diesem Fall auch bedeuten würde, dass alle in der Option fileencodings angegebenen Zeichenkodierungen nicht übereinstimmen), lesen Sie die Datei mit der in der Option encoding angegebenen Zeichenkodierung. Die Standardzeichencodierung für die Option encoding lautet: latin1. Nun, da latin1 die Zeichencodierung mit einem Byte Länge ist, alle Bytes In der Datei sind gültige latin1 Zeichen (sogar das Nul Zeichen ^@, das Sie sehen *).

* - Tatsächlich ist ^@ das Newline-Zeichen im Puffertext des Vim, nicht das Nul-Zeichen.

Die richtige Art, die Datei zu lesen, besteht darin, die Zeichencodierung manuell als UTF-16 anzugeben (wie es aussieht, ist UTF-16 in diesem Fall die richtige Zeichencodierung).

1
colemik