Suchen und Ersetzen innerhalb der Auswahl in `vi`


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.)


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.


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áč


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.


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.


Das lokale ist lokal zur aktuellen Linie
Lazarus
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.