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

Posted

技术标签:

【中文标题】Vim:当使用 \\_ 匹配多行字符串时。在正则表达式中, :yank 命令仅适用于第一行【英文标题】:Vim: when matching a string across multiple lines using \_. in regex, the :yank command only works for the first lineVim:当使用 \_ 匹配多行字符串时。在正则表达式中, :yank 命令仅适用于第一行 【发布时间】:2011-05-16 11:33:46 【问题描述】:

我想提取一些文本的多次出现,这些文本跨越多行并且可以与单个 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 行。

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

【问题讨论】:

可能相关? ***.com/questions/1474966/… 【参考方案1】:

试试这个:

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

用 CTRL-V 输入^M 然后回车。

【讨论】:

这似乎有点令人费解,为什么不直接:%g/first.*\|second.*/yank z 因为这不会拉出中间行。 确实; OP 的最初意图不是很清楚,我看到从那以后这个问题已经被修改得更清楚了。【参考方案2】:

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

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

【讨论】:

如果是这样,为什么我的:%g/first\_.*second.*$/'<,'>y 有效? @Chris 它之所以有效,是因为您明确指定了要抽出的行范围(顺便说一句,它恰好等于匹配的范围 - 请参阅我对您答案的评论)。【参考方案3】:

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

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

【讨论】:

还是不行,只有第一行被拉了。我在上面加了一个例子。 但是如果第一行和第二行之间有一些行没有特定的模式,你怎么能把它们拉出来呢? @tombkeeper:我看到你已经修改了例如发布在您的问题中,因为您之前的措辞不太清楚。

以上是关于Vim:当使用 \_ 匹配多行字符串时。在正则表达式中, :yank 命令仅适用于第一行的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式位置匹配攻略【转】

使用正则表达式匹配 Lua 多行字符串和注释

正则表达式如何匹配多行的所有任意字符

Python Regex:在多行上匹配一个字符?

如何在正则表达式中匹配多行中的任何字符?

perl 正则表达式 匹配多行的问题