2013-06-24 3 views
7

В файле, я хочу, чтобы иметь возможность удалять контекст вокруг шаблона поиска.Как удалить строки вокруг шаблона поиска в vim?

Под контекстом я имею в виду: а) «N» строки до шаблона б) «N» строки после шаблона с) «N» строки после и перед шаблон г) делать, б, путем удаления шаблона линии, а е) делать, б, без удаления шаблона линии

есть ли способ сделать это с помощью :g/ или :%s или какой-то другой способ? Я могу сделать это с помощью макросов, но это не то, что я ищу.

Вот образец текста:

search_pattern random text 1 
line below search pattern(delete me) 
abc def 
pqr stu 
... 
line above search pattern(delete me) 
search_pattern random text 2 
line below search pattern(delete me) 
... 

ответ

15

В основном ключ, что

  • :d может получить числовой аргумент после того, который определяет количество строк для удаления
  • вы можете указать смещение после шаблона, например :/patt/+3

Примечание:

  • Если вы делаете это для всех экземпляров модели, использующие :g/patt/... вместо :/patt/... (благодаря Петру Rincker для напоминания)
  • всех пробелов в бывшем команды ниже являются необязательными, я поставил их для ясности.

Чтобы удалить п строк перед рисунком,

:/patt/-n d n 

Чтобы удалить п строк перед рисунком и шаблон линии

:/patt/-n d p 

где p = n + 1


Чтобы удалить п строк по образцу,

:/patt/+ d n 

Чтобы удалить п строк по образцу и шаблон линии

:/patt/ d p 

, где p = n + 1


Для того, чтобы удалить т строк до и п строк после шаблона (своего рода обман здесь, так как это 2 команды),

:/patt/-m d m | + d n 
  • это работает, потому что после первого d команды, курсор будет на шаблон линии

Чтобы удалить т строк до шаблона, шаблон линии, и п линии по образцу

:/patt/-m d q 

, где q = m + n + 1

+2

Это отлично работает для 1 экземпляра шаблона. Просто добавьте ': g' для всех шаблонов. Пример: ': g/pat/-3d3'. Подробнее см. ': H: g'. –

4

В каждом случае это можно использовать либо относительный диапазон или смещение и аргумент d. Более логично простой вариант зависит от конкретного случая; Я склонен использовать явные диапазоны в инклюзивных случаях (так как вы обычно можете опустить половину диапазона) и аргумент d в противном случае.

Перед рисунком, включая:

:g/regex/-3,d 
:g/regex/-3d4 

Перед рисунком, эксклюзивная:

:g/regex/-3,-1d 
:g/regex/-3d3 

После картины включительно:

:g/regex/,+3d 
:g/regex/d4 

После картины, эксклюзивные:

:g/regex/+1,+3d 
:g/regex/+1d3 

До и после включительно:

:g/regex/-3,+3d 
:g/regex/-3d7 

До и после, эксклюзивные:

:g/regex/-3,-1d|+1,+3d 
:g/regex/-3d3|+1d3 

Обратите внимание, что эти команды потерпит неудачу с E16: Invalid range если диапазон выходит за начало или конец файла ,