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 ?

kal
quelle

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.

Mark Biek
quelle
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.

Vincent Scheib
quelle
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.

Logan Capaldo
quelle
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).

paxdiablo
quelle
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.

Amjith
quelle
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 .

hwrod
quelle