Vim:使用\ __在多行之间匹配字符串时。在正则表达式中,yank命令仅适用于第一行

时间:2010-11-27 06:26:46

标签: regex vim

我想提取一些跨越多行的文本的多个出现,并且可以与单个Vim正则表达式匹配(使用元字符\_)。 不幸的是,匹配的行在Vim中正确突出显示, 当我在匹配的正则表达式后添加任何Vim命令(如删除或猛拉)时, 该命令仅适用于每场比赛的第一行。

示例:

 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-4和7-9行,但是1和7会被删除。

如何抽取/删除所有匹配(突出显示)的行?

3 个答案:

答案 0 :(得分:6)

试试这个:

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

使用CTRL-V输入^M,然后输入。

答案 1 :(得分:0)

正如我在评论中指出的那样;链接的问题可以解决您的问题:

:%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)

答案 2 :(得分:0)

为了在寄存器中累积匹配的行范围,可以使用 以下命令。

:let @a='' | g/^first/,/^second/y A