首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Vim:当使用\_跨多行匹配字符串时。在regex中,:yank命令仅适用于第一行。

Vim:当使用\_跨多行匹配字符串时。在regex中,:yank命令仅适用于第一行。
EN

Stack Overflow用户
提问于 2010-11-27 06:26:46
回答 3查看 3.4K关注 0票数 7

我想要提取跨多行的文本的多次出现,并且可以与单个Vim正则表达式匹配(使用元字符\_)。不幸的是,尽管匹配行在Vim中得到了正确的突出显示,但当我在匹配的regexp之后添加任何Vim命令(如delete或yank)时,该命令只适用于每个匹配的第一行。

示例:

代码语言:javascript
复制
 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行。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-11-27 12:24:18

试试这个:

代码语言:javascript
复制
:let @a=''
:g/first\_.*second.*$/normal! v/second^M$"Ay

使用CTRL输入^M,然后输入.

票数 6
EN

Stack Overflow用户

发布于 2010-11-27 11:15:10

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

代码语言:javascript
复制
:let @a='' | g/^first/,/^second/y A
票数 1
EN

Stack Overflow用户

发布于 2010-11-27 06:33:21

正如我在评论中已经指出的,这个问题已经解决了你的问题:

代码语言:javascript
复制
:%g/your_pattern/yank A
P

为我工作。

如果要在不同行上匹配多个术语,可以尝试(在命令模式下):

代码语言:javascript
复制
"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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4290435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档