VIM ersetzt das Auftreten von Mustern nach einem bestimmten Wort in einer Zeile

7

Ich habe solche Zeilen in meinem Text.

Text vor Muster = Müll ** Text nach Muster ist Muster

Wenn ich %s/pattern/saturn/es in VIM mache , ersetzt es alle Vorkommen von pattern. Aber ich möchte nur die Ereignisse ersetzen, die danach kommen =. Es sollte alles in der vorhergehenden Zeile ignorieren =. Wie geht das?

user13107
quelle

Antworten:

3

Sie können das spezielle Atom verwenden \@<=, um eine Übereinstimmung vorher zu bestätigen ( =.*um sie irgendwo zuvor in dieser Zeile zu machen):

:%s/\(=.*\)\@<=pattern/saturn/g
Ingo Karkat
quelle
Können Sie erklären, wie das funktioniert?
user13107
1
Lesen Sie :help /\@<=(ich kann es nicht besser erklären), aber fühlen Sie sich nicht schlecht, wenn Sie es nicht zuerst bekommen. Es heißt positives Aussehen und ist ziemlich fortgeschritten.
Ingo Karkat
+1 Wirklich elegant. Das Interessante ist, dass Lookbehind mit variabler Breite in Perl nicht unterstützt wird! Ich hätte nie gedacht, dass dem Perl-Regex-Motor jemals etwas fehlen würde, was andere Motoren haben.
Joseph R.
5

Vorausgesetzt , dass Sie nur ein Vorkommen haben patternvor =, können Sie dies in zwei Schritten:

:%s/pattern/saturn/g
:%s/saturn\(.\{-}=\)/pattern\1/

Der \{-}weist .an, faul zu passen (auch bekannt als nicht gierig).

Erläuterung

Dieser erste Schritt ersetzt alle Vorkommen patternvon saturndem nächsten Schritt sucht dann nach dem Wort saturnvor =und ersetzt sie durch pattern.

Vorsicht

Dies setzt ein einzelnes Vorkommen =in jeder Zeile voraus .

Ein besserer Weg (setzt nur einen einzigen =pro Zeile voraus )

Sie können dies mit einem rekursiven Makro tun:

qaqqa:%s/\(=.\{-}\)pattern/\1saturn/@aq@a

Dies ersetzt ein einzelnes Vorkommen von patternafter =mit saturn. Wenn es als Makro gespeichert und rekursiv aufgerufen wird, arbeitet es so lange an der Datei, bis nichts mehr zu ersetzen ist. Es ist hackisch, aber es funktioniert.

Siehe auch

Joseph R.
quelle
Ersetzt dies alle Mustervorkommen nach =? Wie? Ich weiß nicht, wie viele es vorher geben wird.
user13107
@ user13107 Meine ursprüngliche Antwort hat nur eine einzige Instanz von patternafter ersetzt =. Bitte beachten Sie die aktualisierte Antwort.
Joseph R.
Danke Kumpel, das war klug, leider gibt es eine unbekannte Anzahl von ihnen vor =:( argh
user13107
@ user13107 Ich habe einen Hack, um das zu umgehen. Werde posten, wenn ich Zeit habe.
Joseph R.
Dies setzt auch voraus, dass die Zeichenfolge saturnnicht im Text enthalten ist. wahrscheinlich wahr, aber ich würde geneigt sein, etwas viel Dunkleres / Einzigartigeres als die temporäre Ersatzzeichenfolge zu verwenden - myhamsterlivesonsaturnvielleicht :)
cas