我想提取一些跨越多行的文本的多个出现,并且可以与单个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会被删除。
如何抽取/删除所有匹配(突出显示)的行?
答案 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