Einen Bereich von n Zeilen vor und nach einer übereinstimmenden Zeile löschen?

12

Ich habe eine sich wiederholende Konfigurationsdatei und möchte einen regulären Ausdruck abgleichen und einen Zeilenbereich vor und nach einer Übereinstimmung löschen. Ich möchte auch die Übereinstimmung in einem Befehl löschen.

Ich kann nutzen...

:g/match/-1d

... mehrmals, um mehr als eine Zeile vor einem Spiel zu löschen ...

... und kombinieren Sie es mit ein paar Anrufen zu ...

:g/match/+1d

... um mehr als eine Zeile nach dem Spiel zu löschen ...

Aber gibt es eine Möglichkeit, einen Zeilenbereich vor, nach und einschließlich der Übereinstimmung mit einem Befehl zu löschen?

leeand00
quelle

Antworten:

21

Du bist fast da; Sie können auch einen Zeilenbereich angeben, der in Form von [line1],[line2][command]statt nur [line][command](wie Sie ihn jetzt verwenden) vorliegt .

Sie können verwenden ., um auf die aktuelle Zeile zu verweisen.

  • Für die aktuelle und nächste Zeile: :g/match/.,+1d
  • Für die aktuelle und vorherige Zeile: :g/match/-1,.d
  • Für die vorherige, aktuelle und nächste Zeile: :g/match/-1,+1d

Sehen Sie :help [range]für weitere Informationen und in dieser Antwort gibt es einige weitere Beispiele .

Martin Tournoij
quelle
Ist die Syntax in sed gleich?
leeand00
3
@ leeand00 Nein. Sie müssen lediglich :geinen ex-Befehl in den Zeilen ausführen, die einem Muster entsprechen. Das Tippen :g/match/.,+1dwäre also genau das Gleiche wie mit allen Zeilen zu gehen matchund zu :.,+1d
tippen
Dies ist das Coolste, was ich seit einiger Zeit auf vim gelernt habe. Danke für das Teilen!
lps