Czy usunąć zakres n linii przed i po dopasowanej linii?

12

Mam powtarzalny plik konfiguracyjny i chciałbym dopasować wyrażenie regularne i usunąć zakres wierszy przed i po dopasowaniu. Chciałbym również usunąć dopasowanie jednym poleceniem.

Mogę użyć...

:g/match/-1d

... kilka razy, aby usunąć więcej niż jedną linię sprzed meczu ...

... i połącz to z kilkoma połączeniami do ...

:g/match/+1d

... aby usunąć więcej niż jedną linię po meczu ...

Ale czy jest jakiś sposób, aby usunąć zakres wierszy przed dopasowaniem za pomocą jednego polecenia, po nim i włącznie?

leeand00
źródło

Odpowiedzi:

21

Jesteś prawie na miejscu; możesz także określić zakres linii, który ma postać [line1],[line2][command], zamiast po prostu [line][command](tak jak teraz).

Możesz użyć, .aby odnieść się do bieżącej linii.

  • Dla bieżącego i następnego wiersza: :g/match/.,+1d
  • Dla bieżącej i poprzedniej linii: :g/match/-1,.d
  • Dla poprzedniej, bieżącej i następnej linii: :g/match/-1,+1d

Zobacz :help [range]więcej informacji, aw tej odpowiedzi jest jeszcze kilka przykładów .

Martin Tournoij
źródło
Czy składnia jest taka sama w sed?
leeand00
3
@ leeand00 Nie. Wystarczy :guruchomić polecenie ex w wierszach pasujących do wzorca. Więc pisanie :g/match/.,+1dbyłoby dokładnie takie samo jak przechodzenie do wszystkich wierszy matchi pisanie:.,+1d
Martin Tournoij
To jest najfajniejsza rzecz, której nauczyłem się na vimie od jakiegoś czasu. Dzięki za udostępnienie!
lps