Suchen und Ersetzen innerhalb der Auswahl in `vi`

75

Wie mache ich ein Suchen und Ersetzen innerhalb einer Auswahl in vi?

Agnel Kurian
quelle

Antworten:

89

Wählen Sie den Text im visuellen Modus aus (ich nehme an, Sie tun dies) und drücken Sie :, um einen Befehl einzugeben. In der Befehlszeile wird Folgendes angezeigt:

:'<,'>

Das bedeutet, dass der Befehl auf die Auswahl angewendet wird. Geben Sie dann ein s/search/replace/und drücken Sie die Eingabetaste. (Fügen Sie gnach dem dritten Schrägstrich einen hinzu, wenn Sie alle Übereinstimmungen ersetzen möchten, und einen, cwenn Sie für jede Ersetzung eine Bestätigung wünschen.)

Chad Birch
quelle
46
Vorsichtsmaßnahme: Der Bereich funktioniert nur linienweise! Wenn Ihre Auswahl nur einen Teil einer Zeile enthält, funktioniert das Suchen und Ersetzen für die gesamte Zeile. Um eine teilweise Zeile zu finden und zu ersetzen, ist eine Skripterstellung erforderlich.
user55400
2
Ich schlage vor, es vorübergehend in eine andere Zeile zu verschieben, zu ersetzen und zurück zu verschieben.
Benjamin Atkin
87

Die meisten anderen hier vorgeschlagenen Lösungen funktionieren über die GESAMTE Zeile, in der die Auswahl erfolgt, was möglicherweise nicht Ihren Wünschen entspricht.

Um NUR in der Auswahl zu suchen und zu ersetzen, wählen Sie zuerst den Text visuell aus und verwenden Sie dann einen Befehl wie folgt:

:%s/\%VSEARCH/REPLACE/g

Dadurch wird nur im visuell ausgewählten Bereich gesucht und ersetzt, wobei SEARCH durch REPLACE ersetzt wird. Wenn Sie mehr als eine Zeile ausgewählt haben, funktioniert dies auch über mehrere Zeilen.

Brad Parks
quelle
Sollte dies für einen Ersatz funktionieren, wenn ein Teil einer Linie visuell ausgewählt wird? Ich kann es nicht zum Ersetzen von Leerzeichen durch Rückgabe bringen. Ich wähle einen Teil der Linie aus und sie verwenden :%s/\%V /\r/gohne Freude. Das erste Leerzeichen wird ersetzt, die folgenden 4 bleiben jedoch unberührt.
Bentayloruk
Ich habe es gerade versucht und es funktioniert in allen Fällen, in denen ich es versucht habe, außer durch Ersetzen durch eine Rückgabe ;-) Ich denke, es muss daran liegen, dass das erste Ersetzen die Auswahl in eine neue Zeile aufteilt, die nicht mehr in der Auswahl enthalten ist. Um dieses Problem zu umgehen, können Sie es durch eine eindeutige Zeichenfolge ersetzen, z. B. EZ_REPLACE. Führen Sie dann eine globale Suche durch und ersetzen Sie diese ...
Brad Parks
spielt nicht gut, wenn es in einem Makro neu codiert wird. Die Wiedergabe des Makros über mehrere Zeilen funktioniert nicht.
Peter Perháč
2
Weitere Informationen finden Sie unter vim.fandom.com/wiki/Search_and_replace_in_a_visual_selection
Cyriac Antony
21

Wenn Sie zur Auswahl den visuellen Modus verwendet haben, dann:

:'<,'>s/regex/replacement/options

VIM platziert den Bereich ( '<,'>) automatisch, wenn Sie ':'im visuellen Modus (durch Drücken ) in den Befehlszeilenmodus wechseln.

Tomalak
quelle
1
Dies sollte theoretisch wie beabsichtigt funktionieren, aber wie jemand anderes betont hat, wird es in der Praxis an einer beliebigen Stelle innerhalb der Linien ersetzt, an denen die Marke <beginnt und wo sie >endet. Vielleicht ist es möglich, dass es mit dem \%'>Atom funktioniert . Aber meine ersten Experimente sind fehlgeschlagen.
Alpha_989
-3

Wenn Sie eine globale Suche und Ersetzung (mit optionalen regulären Ausdrücken) für alle Instanzen in der Datei durchführen möchten, würde ich Folgendes tun:

:%s/foo/bar/g

Lassen Sie das g weg, um einen lokalen Austausch durchzuführen.

lfaraone
quelle
Das lokale ist lokal zur aktuellen Linie
Lazarus