Kann ich dafür sorgen, dass: s nur im letzten Spiel der Linie funktioniert?

16

:s/pattern/replacementarbeitet im ersten Spiel und :s/pattern/replacement/gauf allen.

Wie funktioniert nur die letzte?

Toothrot
quelle

Antworten:

18

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 \zsund \zeden Anfang und das Ende des gesuchten Musters definieren, mit dem Sie übereinstimmen möchten. Alles Vorher \zsund Nachher \zein 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 \zsund \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

Ryuichiro
quelle
Können Sie bitte eine grundlegende Beschreibung \zsIhrer Antwort geben?
EvergreenTree
3
Es ist erwähnenswert, dass der Grund , dies funktioniert , ist , weil .*ist gierig .
Wildcard
7

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 \1und fügen Sie die hinzu replacement.

:%s/\(.*\)pattern/\1replacement/
bolichep
quelle
(Dies ist der \zsLösung von @ ryuichiro insofern unterlegen , als Ihr \1Ansatz 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.)
Aaron Thoma
0

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-itemsfür den gesamten Abschnitt mit anderen Lookaround-Variationen.

B Schicht
quelle