In einer Datei möchte ich den Kontext um ein Suchmuster löschen können.
Mit Kontext meine ich: a) 'n' Zeilen vor dem Muster b) 'n' Zeilen nach dem Muster c) 'n' Zeilen nach und vor dem Muster d) tue a, b, c, indem du auch die Musterlinie löschst e) tue a, b, c, ohne die Musterzeile zu löschen
Gibt es eine Möglichkeit, es mit :g/
oder :%s
oder auf andere Weise zu machen?
Ich kann das mit Makros machen, aber das ist nicht das, wonach ich suche.
Hier ist ein Beispieltext:
%Vor%Grundsätzlich ist der Schlüssel das
:d
kann ein numerisches Argument hinter sich haben, das die Anzahl der zu löschenden Zeilen angibt Anmerkungen:
:/patt/+3
anstelle von :g/patt/...
(danke an Peter Rincker für die Erinnerung) Um n Zeilen vor dem Muster zu löschen,
%Vor%Löschen von n Zeilen vor dem Muster und der Musterzeile
%Vor% wo :/patt/...
= p
+ 1
Um n Zeilen nach dem Muster zu löschen,
%Vor%Löschen von n Zeilen nach dem Muster und der Musterzeile
%Vor% wo n
= p
+ 1
Um m Zeilen vor und n Zeilen nach dem Muster zu löschen (hier ein bisschen betrügen, da es zwei Befehle gibt),
%Vor%n
auf der Musterzeile Löschen von m Zeilen vor dem Muster, der Musterlinie und n Zeilen nach dem Muster
%Vor% wo d
= q
+ m
+ n
In jedem Fall ist es möglich, entweder einen relativen Bereich oder einen Offset und ein Argument für d
zu verwenden. Die logisch logischere Option hängt vom jeweiligen Fall ab; Ich neige dazu, explizite Bereiche in den Inclusive-Fällen zu verwenden (da Sie in der Regel die Hälfte des Bereichs weglassen können), und andernfalls ein Argument für d
.
Vor dem Muster, inklusive:
%Vor%Vor dem Muster, exklusiv:
%Vor%Nach dem Muster inklusive:
%Vor%Nach dem Muster, exklusiv:
%Vor%Vorher und nachher, inklusive:
%Vor%Vorher und nachher, exklusiv:
%Vor% Beachten Sie, dass diese Befehle mit E16: Invalid range
fehlschlagen, wenn der Bereich über den Anfang oder das Ende der Datei hinausgeht.
Tags und Links vim