Удалить все строки, кроме той, которая соответствует шаблону, и также сохранить 2 строки до совпадения

#vim

#vim

Вопрос:

Возможно ли в vim удалить все строки, кроме тех, которые соответствуют шаблону, а также сохранить пару строк до и после (например, контекст в grep).

Комментарии:

1. Не могли бы вы добавить пример «до / после», пожалуйста?

Ответ №1:

Поскольку вы упомянули grep, вероятно, самый чистый способ — это просто вызвать grep для всего буфера.

 %!grep -2 pattern_to_match
  

Я обновлю, если найду решение с использованием чистого vim, но я сомневаюсь, что оно будет чище, чем вышеупомянутое решение.

Комментарии:

1. Что делает флаг -2?

2. @SylvesterVLowell, это параметр контекста, о котором упоминал OP. В основном это говорит grep отображать две строки до и две строки после совпадения.

Ответ №2:

Другое чисто vim-решение, которое копирует выходные данные в регистр:

 :redir @a
:g/pat/z.5
:redir END
  

Команда :z.5 работает как grep-2. Проверьте справку об этом — ее можно использовать для некоторых интересных эффектов.

Команда redir @a перенаправляет выходные данные в register a и redir END завершает перенаправление.

Но если вы просто хотите увидеть найденные строки с некоторым контекстом, то :g/pat/z.5 это может быть вашим лучшим вариантом.

Ответ №3:

Чистое решение vim с использованием :global

 :let @a=""
:g/pat/-2, 2y A
:%d_
:pu a
:1,2d_
  

Обзор:

Выдерните по 2 строки с каждой стороны шаблона и добавьте в регистр. Затем удалите буфер и замените содержимым регистра.

Примечание: Используйте grep-версию @merlin2011. Это самое простое.

Дополнительную справку см.:

 :h :range
:h :let-@
:h :g
:h quote
:h :d
:h :pu
:h registers