Удаление диапазона из n строк до и после совпавшей строки?

12

У меня есть повторяющийся файл конфигурации, и я хотел бы сопоставить регулярное выражение и удалить диапазон строк до и после совпадения. Я также хотел бы удалить совпадение в одной команде.

Я могу использовать...

:g/match/-1d

... несколько раз, чтобы удалить более одной строки перед матчем ...

... и объединить это с несколькими звонками ...

:g/match/+1d

... удалить более одной строки после матча ...

Но есть ли способ удалить диапазон строк, до, после и включая совпадение одной командой?

leeand00
источник

Ответы:

21

Ты почти там; Вы также можете указать диапазон строк в форме [line1],[line2][command], а не просто [line][command](как вы используете сейчас).

Вы можете использовать .для ссылки на текущую строку.

  • Для текущей и следующей строки: :g/match/.,+1d
  • Для текущей и предыдущей строки: :g/match/-1,.d
  • Для предыдущей, текущей и следующей строки: :g/match/-1,+1d

Смотрите :help [range]для получения дополнительной информации, и в этом ответе есть еще несколько примеров .

Мартин Турной
источник
Синтаксис такой же в sed?
leeand00
3
@ leeand00 Нет. Все, что :gделает, это запускает команду ex в строках, которые соответствуют шаблону. Таким образом, печатать :g/match/.,+1dбыло бы точно так же, как набирать все строки matchи печатать:.,+1d
Martin Tournoij
Это самая крутая вещь, которую я узнал на vim за последнее время. Спасибо, что поделился!
LPS