Interaktiver Regex in Vim suchen / ersetzen?


265

Ich kenne den regulären Ausdruck für einen globalen Ersatz.

     %s/old/new/g

Wie gehen Sie vor, um eine interaktive Suche in Vim zu ersetzen ?

Antworten:


462

Fügen Sie das Flag c hinzu (in der vim-Eingabeaufforderung):

:%s/old/new/gc

gibt Ihnen bei jedem Auftreten von 'alt' eine Ja / Nein-Eingabeaufforderung.

"alt" wird im Text hervorgehoben;  Am unteren Rand des Fensters steht "durch neues ersetzen (j / n / a / q / l / ^ E / ^ y)?)"

Die integrierte Hilfe von Vim bietet nützliche Informationen zu den verfügbaren Optionen, sobald die Ersetzung durch Bestätigung ausgewählt wurde. Verwenden:

:h :s

Scrollen Sie dann zum Abschnitt über Bestätigungsoptionen. Screenshot unten:

Text mit der Aufschrift "[C] Bestätige jede Ersetzung. [...] STRG-Y, um den Bildschirm nach unten zu scrollen."

Verwenden Sie beispielsweise, um diese und alle verbleibenden Übereinstimmungen zu ersetzen a.


30
+1, ich habe heute etwas Neues gelernt! vim hat so viele versteckte Geheimnisse .. :)
Marc Novakowski

10
Das Erlernen von Vim-Befehlen ähnelt dem Spielen von Nethack. Sie wissen nie, welche Wunder ein einzelner Charakter halten wird.
Mark Biek

22
Ich stelle mir vor, das "c" ist für "bestätigen"
Matpie

8
Ich versuche ehrlich gesagt nicht, als snarky rüberzukommen, aber all dies hätte durch ": help: s" gefunden werden können, was Sie direkt zu ": help: s_flags" geführt hätte.
Jeremy Cantrell

13
@jeremy: Dazu muss bekannt sein, dass der Hilfebefehl vorhanden ist und dass der Schalter "Doppelpunkt" eingegeben werden muss, um zur entsprechenden Hilfedatei zu gelangen. Wie oder wo würde man das lernen?
Dennis

79

Mark Biek wies darauf hin, indem er:

%s/old/new/gc

für eine globale Suche durch Bestätigung für jede Ersetzung ersetzen. Es macht mir aber auch Spaß, interaktiv zu überprüfen, ob der alte Text korrekt übereinstimmt. Ich mache zuerst eine Suche mit einem regulären Ausdruck, dann verwende ich dieses Muster wieder:

/old.pattern.to.match
%s//replacement/gc

Der s//verwendet das letzte Suchmuster.


9
Eines der größten Dinge beim Verwenden / Lernen von vim ist, wie tief das Kaninchenloch geht!
Ken

2
Schön, ich habe immer gesucht und dann mit <Cr> / die letzte Suche in den Ersatzbefehl eingefügt.
Atilla Filiz

Genau das, was ich von Sublime Text vermisse!
Xenofex

Diese Antwort ist besonders nützlich, da ich mir oft vorstelle, dass Sie sich dafür entscheiden, Instanzen eines Wortes zu ersetzen. Es ist das Wort, nach dem Sie gerade gesucht haben.
M_M

20

Ich denke, Sie suchen c, z. B. s/abc/123/gcwird dies dazu führen, dass VIM die Ersetzungen bestätigt. Siehe: Hilfe: Ersatz für weitere Informationen.


9

Normalerweise benutze ich den Befehl find / replace / next / repeat :-)

/old<CR>3snew<ESC>n.n.n.n.n.n.n.

Das ist find "old", substitute 3 characters for "new", find next,repeat substitute , und so weiter.

Es ist ein Schmerz für massive Substitutionen, aber Sie können einige alte Vorkommnisse selektiv ignorieren (indem Sie einfach nerneut drücken , um die nächste zu finden, anstatt .eine Substitution zu wiederholen).


Ich benutze dies auch für ähnliche Texte. (3cW <texthere> <ESC> <an neuen Ort verschieben>. <Move>. <Move>.)
Strager

1
Es ist kein Antimuster! Es ist süß. Und Sie können mit N in die entgegengesetzte Richtung suchen. Wirklich gut, wenn Sie ein Wort sehen und es ändern möchten. * cwNewText <ESC> Nnn (Dies springt vom Wort unter dem Cursor weg, springt dann aber zurück, sobald Sie das nächste Vorkommen geändert haben.
PEZ

was ist <CR>?
Sother

9

Wenn Sie nur die Anzahl der Vorkommen von 'abc' zählen möchten, können Sie dies tun %s/abc//gn. Dies ersetzt nichts, sondern gibt nur die Anzahl der Vorkommen von 'abc' an.


3

Wenn sich Ihr Ersatztext für jedes übereinstimmende Vorkommen ändern muss (dh nicht einfach Ja / Nein wählen, um einen einzelnen Ersatz anzuwenden), können Sie ein von mir erstelltes Vim-Plugin namens Interactive-Replace verwenden .


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.