Suchen und Ersetzen von Steuerzeichen (^ @, ^ M, ^ I…) in vi

14

Ich kopierte diese Zeile /proc/some_proc_id/cmdlinein meinem Ubuntu-Computer,

java^@-jar^@/usr/lib/selenium/selenium-server-standalone.jar^@-port^@4444^@-trustAllSSLCertificates^@

Irgendwie werden die Leerzeichen durch ^@vi dargestellt. Ich habe versucht, sie mit dem Befehl durch Leerzeichen zu ersetzen.

:%s#^@# #g

Aber es sagt pattern not found ^@.

Wie kann man Sonderzeichen ersetzen, insbesondere solche, die mit einem Karat-Symbol beginnen?

Gilles 'SO - hör auf böse zu sein'
quelle
Welchen Terminaltyp verwenden Sie?
Ed Heal
manchmal TERMund oft ist esscreen
Welches Terminalprogramm verwenden Sie und ist die TERMUmgebungsvariable richtig eingestellt?
Ed Heal

Antworten:

15

Irgendwie werden die Leerzeichen durch ^@vi dargestellt.

Das hat es nicht vigetan. Obwohl Sie Befehlszeilen in Shells mit Leerzeichen zwischen den Argumenten eingeben, handelt es sich bei Befehlszeilen tatsächlich um diskrete Folgen von Zeichenfolgen, nicht um eine durch Leerzeichen getrennte Zeichenfolge. Die Shell trennte die Befehlszeile vor dem Start des Befehls in einzelne Argumentzeichenfolgen.

In C werden Zeichenfolgen mit NUL-Zeichen abgeschlossen und als angezeigt ^@.

Wie kann man Sonderzeichen ersetzen, insbesondere solche, die mit einem Karat-Symbol beginnen?

Um diese Zeichen eingeben zu können, müssen Sie ihnen Control- vfür das nächste Zeichen voranstellen .

Zum Beispiel in diesem Fall: Control- vgefolgt von Control- @.

Das Sonderzeichen, das wörtliche nächste Zeichen einführt, ist normalerweise Control- vaber es ist tatsächlich konfigurierbar. Geben Sie ein stty -a, um herauszufinden, auf was es festgelegt ist. Suchen Sie nach lnextin der Ausgabe.

Celada
quelle
der post ist informativ .. aber die wirkliche lösung für meine frage ist das karatzeichen - :%s#^@##g. Seit ich kopiere, vom Terminal eingefügt, hat vi sie als Originalzeichen eingefügt ...
1
@MadhavanKumar Sie nicht das Caret - Zeichen entkommen, denn es ist kein Caret - Zeichen. Es ist wirklich ein tatsächlicher Kontrollcharakter. ^letterIst nur eine visuelle Notation dafür, kein echtes Caret. Und ja, Sie müssen dem Steuerzeichen entkommen, die Tastenkombination Strg-V bewirkt dies über die Tastatur. Das funktioniert fast überall. Zu Ihrer Information, die andere Antwort enthält eine Alternative, die spezifisch für vidie Befehlszeile ist, um zu vermeiden, dass das Steuerzeichen überhaupt eingegeben werden muss.
Celada
@MadhavanKumar Wenn Ihr Terminal die NUL-Zeichen als zweistellige Zeichenfolge anzeigt ^@und Sie diese kopiert haben, verwenden Sie \^@diese Zeichenfolge, um sie in vi darzustellen. Viele Softwareprogramme verwenden Backslash, um "das nächste Zeichen wörtlich zu interpretieren, anstatt seine spezielle Funktion zu verwenden".
Gilles 'SO- hör auf böse zu sein'
@ Gilles, Sie haben Recht .. das ist, was ich versucht, Celada zu vermitteln ....
4

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

Du könntest es versuchen:

:%s/\%x00/ /g

Alternative:

Auf einer Tastatur, auf der sich das @ -Symbol über der 2Taste befindet (danke Celada), können Sie Folgendes tun:

  • %s/<CTRL-2>/ /g (auf dem PC)

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

Wobei <CTRL-2>bedeutet, zuerst den CTRLPC herunterzudrücken, gedrückt zu halten, zu drücken 2, loszulassen CTRL.

und <CTRL-SHIFT-2>Mittel zuerst nach unten drücken, die controlauf Mac, hält es so nach unten gedrückt wird, drücken Sie shiftauf Mac, als nach unten gedrückt halten, Hit 2, Release controlund shift.

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

Dieser Befehl ersetzt alle ^@durch Leerzeichen.

( Quelle )

erik
quelle
Wenn Sie "PC" sagen, meinen Sie Windows?
Sparhawk
1
STRG-2 und STRG-UMSCHALT-2 sind nur bei Tastaturlayouts sinnvoll, bei denen sich das @über der 2Taste befindet.
Celada
@Sparhawk: Nein, ich meine einen Linux-PC. :-)
Erik
Warum STRG? Ich habe noch nie ein System gesehen, in dem STRG die Taste ist, mit der zwischen den verschiedenen Bedeutungen einer Taste gewechselt wird. Das ist normalerweise SHIFT.
Terdon
Es ist seltsam (vielleicht ein Bug in Vim?), Aber es funktioniert. Es sollte normalerweise STRG + UMSCHALT + 2 sein (auf einer US-Tastatur). Stellen Sie es als separate Frage oder fragen Sie die VIM-Entwickler. Trotzdem ist Celadas Antwort für Steuerzeichen allgemeiner.
Erik