Wie entgeht man Backslashes und Forward Slashes in VIM find / search?

96

Wenn ich zum Beispiel suchen und durch Zeichenfolgen ersetzen möchte, die Schrägstriche mit Rückwärts- oder Vorwärtsrichtung enthalten, wie würde dies in vim erreicht werden? Danke dir!

Beispiele Suchen & Ersetzen ist: :%s/foo/bar/g

Was wäre, wenn ich alle Vorkommen finden <dog/>und durch ersetzen wollte?<cat\>

Sturmist
quelle
3
Nicht unbedingt eine Antwort, aber Sie sollten wahrscheinlich lesen: Hilfe Magie
Tom Morris
+1 Tom, im Allgemeinen die vernünftigste Lösung, wenn Sie mit einem mehr als trivialen regulären Ausdruck arbeiten.
Randy Morris
@ Tom @ Randy jedoch ... die vi --helpauf meinem Server bietet keine Erklärung für das Entkommen von Sonderzeichen ... weshalb die Leute zunächst zu Stackoverflow kommen ...
aequalsb
@aequalsb :help magicist etwas, das Sie in vim eingeben . Es ist kein Befehlszeilenargument für vim.
DoubleDown

Antworten:

150

Genauso wie Sie Zeichen in Linux-Programmen fast überall mit einem Backslash entkommen:

:%s/<dog\/>/<cat\\>

Beachten Sie jedoch, dass Sie stattdessen ein anderes Trennzeichen auswählen können:

:%s@<doc/>@<cat\\>@

Dies erspart Ihnen das Eingeben all dieser zeitaufwändigen, verwirrenden Backslashes in Mustern mit einer Menge Slashes.

Aus der Dokumentation :

Anstelle des /Musters und der Ersetzungszeichenfolge können Sie jedes andere Einzelbytezeichen verwenden, jedoch kein alphanumerisches Zeichen \, "oder |. Dies ist nützlich, wenn Sie ein /in das Suchmuster oder die Ersatzzeichenfolge aufnehmen möchten .

Cascabel
quelle
1
So wird automatisch das von Ihnen gewählte Trennzeichen ermittelt?
Stormist
11
Ja. Das Zeichen nach dem swird als Trennzeichen verwendet. Ich kann nicht herausfinden, wo ich eine Liste in der Dokumentation gefunden habe, aber ich bin mir ziemlich sicher, dass sie zumindest /:;*%@#gültig sind.
Cascabel
Dies ist praktisch, wenn Sie \ in / in einer Datei mit vielen Pfaden im Windows-Stil ersetzen. Vielen Dank.
Isaac Nequittepas
Um zu dieser Nachricht in der Dokumentation zu gelangen, verwenden Sie: h e146
jcollado
Hatte keine Ahnung, dass Sie das Trennzeichen ändern könnten! Das ist riesig - danke.
Brettins
22
%s:<dog/>:<cat>

Sie können die / Trennzeichen ersetzen, wenn sie für bestimmte Muster ärgerlich werden.

Sarah
quelle
3
+1 für :Trennzeichen. Ich wusste nicht, dass du das gebrauchen kannst. Ich habe es immer @in Zeiten der Flucht benutzt
Jeffrey Jose
8

Zitiere sie mit einem Backslash. Außerdem ist es oft hilfreich, neben dem Schrägstrich ein anderes Trennzeichen zu verwenden.

 :%s#<dog/>#<cat\\>#

oder wenn Sie einen Schrägstrich als Ersatzbefehlsbegrenzer verwenden müssen

 :%s/<dog\/>/<cat\\>/
Wallyk
quelle
3

Die Syntax lautet:

:%s/<dog\/>/<cat\\>/g
Maurizio Reginelli
quelle
2

Ich suchte nach etwas Ähnlichem, um nach Registerwerten zu suchen, die das /Zeichen enthalten (um ein Makro aufzuzeichnen). Die Lösung bestand darin, mit dem ?Token anstelle des zu suchen /.

Fernando
quelle
Beachten Sie, dass ?eine Rückwärtssuche durchgeführt wird und nicht dasselbe ist.
Martin Tournoij
-1

Backslash Slash Backslash Star

/(<- the prompt)\/\*

Nachdem Sie eingegeben haben, sieht es so aus

/\/\*
jim k
quelle
1
Inwiefern unterscheidet sich diese Antwort von denen, die seit fast sechs Jahren auf der Website sind?
Martin Tournoij