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 命令仅适用于第一行的主要内容,如果未能解决你的问题,请参考以下文章