2012-08-16 22 views
6

Oft in vim wie diese mag ich suchen und ersetzen:Vim Suchen und Ersetzen Efficiency

:%s/<search_pattern>/<search_pattern>_foo/g 

Gibt es eine Möglichkeit, diese Syntax effizienter zu machen, damit ich <search_pattern> im Wert ersetzen verweisen können? Ich denke, es wäre etwas Ähnliches, wenn ich nach Gruppenname/-nummer referenziere, aber ich kann keine Dokumente zu diesem Thema finden.

Antwort

13

den & Charakter Verwenden Sie das abgestimmte Muster im Ersatz darstellen:

:%s/<search_pattern>/&_foo/g 

Alternativ können Sie \0 verwenden, die ein Rückverweis für das gesamte abgestimmte Muster ist, und kann so sein, leichter zu merken:

:%s/<search_pattern>/\0_foo/g 

Siehe :help sub-replace-special

Und dank @kev, yo u kann ein leeres Muster am Ende der Suchzeichenfolge zwingen \zs, unter Verwendung von __foo_ im Austausch ersetzt werden:

:%s/<search_pattern>\zs/_foo/g 

Das bedeutet: das Ende des Suchbegriffs mit __foo_ ersetzen.

+3

':% s/ \ zs/_foo/g' Werke auch. – kev

3

Sie können entweder & für das gesamte Suchmuster verwenden oder Sie können Gruppen verwenden, um einen Abschnitt des Musters abzugleichen. Mit &:

:%s/<search_pattern>/&_foo/g 

Dies würde erreichen, was Sie suchen. Wenn Sie etwas komplexere Gruppen benötigen. Um eine Gruppe zu erstellen, müssen Sie einen Teil des Suchmusters mit (Escape-) Klammern umgeben. Sie können das dann mit \n referenzieren, wobei n die Gruppennummer ist. Ein Beispiel würde es besser erklären.

Sie haben die folgende Datei:

bread,butter,bread,bread,bread,butter,butter,etc 

Sie wollen jede Instanz von bread,butter-bread and butter ändern:

:%s/\(bread\),\(butter\)/\1 and \2/g