Ich kann :%s/<search_string>/<replace_string>/g
eine Zeichenfolge in einer Datei :s/<search_string>/<replace_string>/
ersetzen oder in der aktuellen Zeile ersetzen.
Wie kann ich Wörter aus ausgewählten Zeilen in vim auswählen und ersetzen?
Beispiel: Ersetzen Sie Text aus Zeilen 6-10
, 14-18
aber nicht aus 11-13
.
Antworten:
Der
:&&
Befehl wiederholt die letzte Ersetzung mit denselben Flags. Sie können die zusätzlichen Bereiche angeben (und so viele verketten, wie Sie möchten):Wenn Sie jedoch viele Bereiche haben , würde ich lieber eine Schleife verwenden:
quelle
:6,10s/<search_string>/<replace_string>/g | :14,18&& | :20,23&& | :28,31&&
funktioniert auch,for
Schleife erleichtert das Erinnern und Ausführen.:
Befehl für die nachfolgenden Befehle ist übrigens optional, sodass Sie weitere Tastenanschläge speichern können.:&&
spart mir Hunderte von Tastenanschlägen pro Woche. Vielen Dank!Alles ersetzen:
Suchen Sie jedes Vorkommen von 'foo' (in allen Zeilen) und ersetzen Sie es durch 'bar'.
Für bestimmte Zeilen:
Ändern Sie jedes 'foo' für alle Zeilen von Zeile 6 bis einschließlich Zeile 10 in 'bar'.
quelle
/
geben Sie Flags für die Operation an. Dieser Befehl ersetzt normalerweise die erste Übereinstimmung in einer Zeile. Mit demg
Flag werden alle Vorkommen ersetzt.%
Ding macht die Arbeit! Ansonsten ist es nur das erste Vorkommen.%
=> Führen Sie diesen Befehl in allen Zeilen aus.g
=> mehrere Vorkommen in derselben Zeile abgleichen.Als Randnotiz, anstatt die Zeilennummern eingeben zu müssen, markieren Sie einfach die Zeilen, die Sie in einem der visuellen Modi suchen / ersetzen möchten:
VISUAL
mode ( V)VISUAL BLOCK
Modus ( Ctrl+ V)VISUAL LINE
Modus ( Shift+ V, funktioniert am besten in Ihrem Fall)Geben Sie nach Auswahl der zu ersetzenden Zeilen den folgenden Befehl ein:
Sie werden feststellen, dass der Bereich
'<,'>
automatisch für Sie eingefügt wird:Hier
'<
bedeutet einfach die erste hervorgehobene Zeile und'>
die letzte hervorgehobene Zeile .Beachten Sie, dass das Verhalten im
NORMAL
Modus möglicherweise unerwartet ist :'<
und'>
zeigen Sie auf den Anfang und das Ende der letzten Hervorhebung in einem derVISUAL
Modi. Stattdessen kann imNORMAL
Modus die spezielle Zeilennummer.
verwendet werden, was einfach aktuelle Zeile bedeutet . Daher können Sie nur in der aktuellen Zeile wie folgt suchen / ersetzen:Beachten Sie außerdem, dass das Einfügen einer Sekunde
:
zwischen dem Bereich und dem Befehl find / replace keinen Schaden anrichtet. Mit anderen Worten, diese Befehle funktionieren weiterhin:quelle
Sie können dies mit zwei Such- / Ersetzungssequenzen tun
Das zweite Mal müssen Sie nur den Bereich anpassen. Anstatt alles auszutippen, würde ich mich an den letzten Befehl erinnern und nur den Bereich bearbeiten
quelle
Wenn Sie in vim verwirrt sind, welche Zeilen betroffen sind, verwenden Sie unten
Ändern Sie jedes 'foo' in 'bar', aber bitten Sie zuerst um Bestätigung. Drücken Sie 'y' für Ja und 'n' für Nein. Vergessen Sie nicht, danach zu speichern
quelle
c
Flag zusätzlich zur Angabe des Bereichs verwenden,:6,10s/<search_string>/<replace_string>/c
funktioniert also.c
steht fürconfirm
. Ich benutze diec
Flagge ziemlich oft, um zu verhindern, dass versehentlich Wörter ersetzt werden, bei denen ich nicht daran gedacht habe, dass sie auch dort existieren.Beispiele für das Suchen und Ersetzen von VI-Befehlen
Angenommen, Sie möchten ein Wort namens "foo" finden und durch "bar" ersetzen.
Drücken Sie zuerst die
[Esc]
Taste%s/foo/bar/
Geben Sie Folgendes ein: (Doppelpunkt) gefolgt von und drücken Sie die [Eingabetaste]:%s/foo/bar/
quelle
:%s/<search_string>/<replace_string>/g
Befehl ersetzt alle Vorkommen in der gesamten Datei. Nicht gerade die Antwort auf die Frage, aber dennoch nützlich :)Wir müssen uns nicht die Mühe machen, die aktuelle Zeilennummer einzugeben.
Wenn Sie jeweils
foo
diebar
aktuelle Zeile (.
) und die beiden nächsten Zeilen (+2
) ändern möchten , gehen Sie einfach wie folgt vor :Wenn Sie bestätigen möchten, bevor Änderungen vorgenommen werden, ersetzen Sie diese
g
durchgc
:quelle
:.,$s/foo/bar/gc
das Suchen und Ersetzen von der aktuellen Zeile bis zum Ende der Datei.Suchen und ersetzen
g => globale Suche
c => Bitten Sie zuerst um Bestätigung
i => Groß- und Kleinschreibung wird nicht berücksichtigt
Wenn Sie einen direkten Austausch ohne Bestätigung wünschen, verwenden Sie den folgenden Befehl
Wenn Sie für jedes Ersetzen eine Bestätigung wünschen, führen Sie den folgenden Befehl aus
Bitten Sie zuerst um Bestätigung. Bei dieser Suche wird die Groß- und Kleinschreibung nicht berücksichtigt.
quelle
Das Festlegen des Bereichs durch visuelle Auswahl ist in Ordnung, aber wenn es sehr einfache Operationen über nur ein paar Zeilen gibt, die von einem Operator ausgewählt werden können, ist es am besten, diese Befehle als Operatoren anzuwenden.
Dies kann leider nicht über Standard-Vim-Befehle erfolgen. Sie könnten eine Art Workaround mit dem! (Filter-) Operator und jedes Textobjekt. Um die Operation beispielsweise auf einen Absatz anzuwenden, haben Sie folgende Möglichkeiten:
Dies muss als "Anwenden des Operators! Innerhalb eines Absatzes" gelesen werden. Der Filteroperator startet den Befehlsmodus und fügt automatisch den Zeilenbereich gefolgt von einem Literal "!" Ein. dass Sie gleich danach löschen können. Wenn Sie dies anwenden, auf den folgenden Absatz:
Das Ergebnis nach dem Drücken von "! Ap" wäre wie folgt:
Als die '.' (Punkt) bedeutet, dass die aktuelle Linie, der Bereich zwischen der aktuellen Linie und den 5 Linien danach für die Operation verwendet wird. Jetzt können Sie den Ersatzbefehl auf die gleiche Weise wie zuvor hinzufügen.
Der schlechte Teil ist, dass dies nicht einfacher ist, als den Text für letzteren auszuwählen, der den Operator anwendet. Der gute Teil ist, dass dies das Einfügen des Bereichs für andere ähnliche Textbereiche (in diesem Fall Absätze) mit deutlich unterschiedlicher Größe wiederholen kann. Dh wenn Sie später den Bereich größeren Absatz wählen möchten, das '.' Wille dazu richtig.
Wenn Sie die Idee mögen, semantische Textobjekte zur Auswahl des Operationsbereichs zu verwenden, können Sie auch mein Plugin EXtend.vim überprüfen , das das Gleiche tun kann, aber auf einfachere Weise.
quelle
Um diese Frage zu beantworten:
:40,50s/foo/bar/g
Ersetzen Sie foo durch einen Balken in diesen Zeilen zwischen der 40. Zeile und der 50. Zeile (einschließlich). Wenn Sie diesen Befehl ausführen, können Sie ihn derzeit in einer beliebigen Zeile eingeben.
:50,40s/foo/bar/g
funktioniert auch, vim wird Sie um Bestätigung bitten und dann den Ersatz für Sie vornehmen, als hätten Sie den ersten Befehl eingegeben.
:,50s/foo/bar/g
Ersetzen Sie foo durch einen Balken in diesen Zeilen zwischen der Zeile, in der Sie sich gerade befinden, und der 50. Zeile (einschließlich). (Wenn Sie sich in einer Zeile befinden, nachdem die 50. Zeile vim erneut um Bestätigung gebeten hat)
Um den Unterschied zwischen vim und dem Vrapper-Plugin von Eclipse zu verdeutlichen:
Beachten Sie, dass in Varpper
:,50s/foo/bar/g
Befehl wird NICHT funktionieren.:50,40s/foo/bar/g
wird funktionieren, ohne um Bestätigung zu bitten.(Für Vrapper Version 0.74.0 oder älter).
quelle
Angenommen, Sie möchten das oben Gesagte durch andere Informationen ersetzen.
COMMAND(:%s/\/sys\/sim\/source\/gm\/kg\/jl\/ls\/owow\/lsal/sys.pkg.mpu.umc.kdk./g)
In diesem Fall wird das oben Gesagte durch (
sys.pkg.mpu.umc.kdk.
) ersetzt.quelle
%s
Eingaben geändert werden sollen, aber wissen möchte, wie dies "semi-global" zu tun ist (dh seine Spezifikation lautet Zeilen 6-10 und 14-18, jedoch nicht in den Zeilen 11-). 13)./
, zum Beispiel!
,@
,_
::%s_/sys/sim/source/gm/kg/jl/ls/owow/lsal_sys.pkg.mpu.umc.kdk_g