Vim: при сопоставлении строки в нескольких строках с помощью \ _.в регулярном выражении команда yank работает только для первой строки - PullRequest
7 голосов
/ 27 ноября 2010

Я хочу извлечь несколько вхождений некоторого текста, который занимает несколько строк и может быть сопоставлен с одним регулярным выражением Vim (с использованием метасимвола \_).К сожалению, хотя соответствующие строки правильно выделены в Vim, когда я добавляю любую команду Vim (например, delete или yank) после соответствующего регулярного выражения, команда работает только в первой строке каждого соответствия.

Пример:

 1: bad_function(arg1,  
 2:              arg2, arg3,
 3:              ...
 4:              argN);
 5: good_function();
 6: ...
 7: bad_function(arg2_1,
 8:              ...
 9:              arg2_N);
10: another_good_function();  

Если я выполню :g/bad_function([^;]\+\_[^;]\+;$/d, удаляются только строки 1 и 7, хотя выделены строки 1-4 и 7-9.

Как восстановить/ удалить все совпадающие (выделенные) строки?

Ответы [ 3 ]

6 голосов
/ 27 ноября 2010

Попробуйте это:

:let @a=''
:g/first\_.*second.*$/normal! v/second^M$"Ay

Введите ^M с помощью CTRL-V, затем нажмите Enter.

0 голосов
/ 27 ноября 2010

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

:let @a='' | g/^first/,/^second/y A
0 голосов
/ 27 ноября 2010

Как уже указывалось в моем комментарии; связанный вопрос имеет решение вашей проблемы:

:%g/your_pattern/yank A
P

у меня работает.

Если вы хотите сопоставить несколько терминов в разных строках, вы можете попробовать (в командном режиме):

"zyy (do this on empty line to empty the register 'z')
:%g/first.*\|second.*/yank z (grab matches in the 'z' register)
P (for pasting the contents of the last register)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...