6

Я использую vim, чтобы удалить все строки, кроме тех, которые соответствуют определенной строке, например

:г!/[строка, которую я хочу оставить в редакторе]/d

Работает отлично. Но то, что я действительно хочу и нигде не нашел, это способ использования vim для удаления всего, кроме нескольких строк.

Например, допустим, у меня есть открытый файл со следующей информацией:

Dave came at 12PM
Lucy came at 11AM
Trish came at 5PM
John ate lunch at 2PM
Virgil left at 3PM
Dave left at 6PM

и я хочу, чтобы у меня остались только события, в которых упоминаются Дейв и Джон - какую команду vim я мог бы использовать, чтобы просто закончить:

Dave came at 12PM
John ate lunch at 2PM
Dave left at 6PM

Я понимаю, что могу использовать инструменты командной строки, такие как findstr в Windows и другие в * nix, но я часто бываю в vim и не смог разобраться с какой-либо командой regex или vim, которая это сделает. Спасибо!

3 ответа3

13

Команда :global которую вы ссылаетесь в своем вопросе, на самом деле не просто принимает буквенные строки, она обрабатывает любое регулярное выражение. Итак, вам просто нужно придумать тот, который имеет две ветви, одну для John и одну для Dave . Вуаля:

:g!/Dave\|John/d

Обратите внимание, что этот упрощенный вариант также подходит Johnny ; Вы, вероятно, хотите ограничить совпадения целыми ключевыми словами:

:g!/\<\(Dave\|John\)\>/d

Регулярные выражения - мощная особенность Vim; стоит узнать о них больше. Начните с :help regular-expression .

6

Следующие должны это сделать

:v/\v(Dave|John)/d

Сломать

:v                  matches all lines not containing the search expression 
/\vDave|John        search expression
/d                  execute delete on all those lines 
0

Использовать этот:

:%s/^[^Dave|John].*\n//

Имея в виду:

%            means search the whole file
^            at the beginning of the line
[^Dave|John] something that isn't Dave nor John
.*           match anything
\n           new line character
//           replace with nothing

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .