Antworten:
ich würde ... benutzen \zs
:%s/.*\zspattern/replacement/
Ein bisschen Erklärung:
.
steht für ein beliebiges einzelnes Zeichen*
repräsentiert gieriges Matching (so viele wie möglich)In Vim können Sie Anker mit der Breite Null verwenden \zs
und \ze
den Anfang und das Ende des gesuchten Musters definieren, mit dem Sie übereinstimmen möchten. Alles Vorher \zs
und Nachher \ze
in Ihrem Muster bleibt vom Austausch unberührt.
Zum besseren Verständnis möchte ich dieses Beispiel aus dem Suchen und Ersetzen von Wikia verwenden :
Speichern Sie die Eingabe mit
\zs
und\ze
, um den Anfang und das Ende eines Musters festzulegen. Zum Beispiel anstelle von::s/Copyright 2007 All Rights Reserved/Copyright 2008 All Rights Reserved/
Verwenden:
:s/Copyright \zs2007\ze All Rights Reserved/2008/
Weitere Informationen finden Sie unter
Sie können nach der letzten Übereinstimmung suchen, indem Sie alle \(.*\)
, aber das letzte Vorkommen von gruppieren pattern
. Beenden Sie dann mit der erfassten Gruppe \1
und fügen Sie die hinzu replacement
.
:%s/\(.*\)pattern/\1replacement/
\zs
Lösung von @ ryuichiro insofern unterlegen , als Ihr \1
Ansatz funktional äquivalent, aber ausführlicher ist. (Auf der anderen Seite ist es für einige möglicherweise einfacher, sich zu erinnern, insbesondere wenn sie an andere Regex-Aromen gewöhnt sind.)
Der Vollständigkeit halber dachte ich, ich würde eine Alternative posten. Vim verfügt über mehrere Elemente, von denen einige den standardmäßigen Lookaround-Behauptungen für reguläre Ausdrücke (negativer / positiver Lookahead / Lookbehind) ähneln. /programming/2973436/regex-lookahead-lookbehind-and-atomic-groups
In diesem Fall wollen wir einen negativen Lookahead, das \@!
heißt, wir wollen behaupten, dass das Atom , das dem Element vorausgeht, nicht nach dem Muster auftritt . In diesem Fall ist das Atom das Muster selbst, dem etwas anderes vorangeht:
:%s/pattern\(.*pattern\)\@!/replacement/
Der Teil in den Klammern hat die Breite Null und ist nicht in der Übereinstimmung enthalten, sodass er nicht durch die Ersetzung ersetzt wird.
:h \@!
Für weitere Informationen oder :h pattern-multi-items
für den gesamten Abschnitt mit anderen Lookaround-Variationen.
\zs
Ihrer Antwort geben?