Wie mache ich eine Suche und Ersetzen innerhalb einer Auswahl in vi
?Suchen und Ersetzen innerhalb der Auswahl in `vi`
Antwort
Wählen Sie den Text im visuellen Modus (Ich gehe davon aus, dass das, was Sie tun), dann :
drücken die Eingabe eines Befehls zu starten, werden Sie so etwas wie dies erscheint in der Kommandozeile sehen Das bedeutet, dass der Befehl auf die Auswahl angewendet wird. Dann geben Sie s/search/replace/
ein und drücken Enter. (Ein g
nach dem dritten Schrägstrich hinzufügen, wenn Sie alle Spiele zu ersetzen, und ein c
, wenn Sie eine Bestätigung wünschen für jeden ersetzen)
Einige weitere Hilfe hier Search and replace in a visual selection
Wenn Sie Visual Mode verwendet, um auszuwählen, dann:
:'<,'>s/regex/replacement/options
VIM den Bereich platzieren ('<,'>
) automatisch, wenn Sie Online-Modus gehen in die Befehlstaste (durch ':'
drücken) aus dem visuellen Modus heraus.
:'<,'>
:
Dies sollte theoretisch wie vorgesehen funktionieren, aber wie jemand anders hervorhebt, wird in der Praxis überall in den Zeilen ersetzt, wo die Marke "<" beginnt und wo>> endet. Vielleicht ist es möglich, es mit dem "\%"> "Atom" arbeiten zu lassen. Aber meine anfänglichen Experimente sind fehlgeschlagen. –
Sie haben Recht. Ich habe es nie bemerkt. – Tomalak
Wenn Sie eine globale Suche machen wollen und ersetzen (mit optionaler Regexes) für alle Instanzen in der Datei, würde ich folgendes tun:
:%s/foo/bar/g
Lassen Sie die g eine lokale ersetzen zu tun.
Die lokale ist lokal in der aktuellen Zeile – Lazarus
Die meisten anderen Lösungen, die hier vorgeschlagen werden, funktionieren über die gesamte Zeile, in der die Auswahl erfolgt, die möglicherweise nicht das ist, was Sie möchten.
nur in der Auswahl zu suchen und zu ersetzen, wählen Sie zunächst visuell den Text, dann einen Befehl verwenden, etwa so:
:%s/\%VSEARCH/REPLACE/g
Dies wird die Suche tun und nur in dem visuell ausgewählten Abschnitt ersetzen, mit SUCHEN ersetzen ERSETZEN. Wenn Sie mehr als eine Zeile ausgewählt haben, funktioniert dies auch über mehrere Zeilen.
Sollte dies für einen Ersatz bei der visuellen Auswahl Teil einer Zeile funktionieren? Ich kann es nicht schaffen, Räume durch Rückkehr zu ersetzen. Ich wähle einen Teil der Zeile und sie verwenden ':% s/\% V/\ r/g' ohne Freude. Das erste Leerzeichen wird ersetzt, aber die folgenden 4 bleiben unberührt. – bentayloruk
Ich habe es gerade ausprobiert, und es funktioniert in allen Fällen, die ich ausprobiert habe, bis auf Ersetzen durch eine Rückgabe ;-) Ich denke es muss sein, weil die erste Ersetzung die Auswahl in eine neue Zeile aufbricht, die nicht mehr in der Auswahl ist. Als Workaround könnten Sie durch eine eindeutige Zeichenfolge ersetzen, z. EZ_REPLACE, dann eine globale Suche und ersetzen Sie dafür ... –
spielt nicht gut, wenn in einem Makro umcodiert. Das Abspielen des Makros über mehrere Zeilen funktioniert nicht. –
Vorbehalt: Der Bereich funktioniert nur zeilenweise! Wenn Ihre Auswahl nur einen Teil einer Zeile enthält, funktioniert das Suchen und Ersetzen in der gesamten Zeile. Das Suchen und Ersetzen partieller Zeilen erfordert Skripting afaik. – user55400
Ich schlage vor, es vorübergehend in eine andere Zeile zu verschieben, das Ersetzen durchzuführen und es zurück zu bewegen. –