答案1
这可以简单地实现,通过运行设置了标志:s
的命令n
(基本上说,不替换任何内容(但通过\=
在替换部分使用,您仍然可以捕获匹配项(参见:h sub-replace-special
)。所以首先让我们清除寄存器 A:
qaq
然后,您可以使用以下命令将您的 maches 捕获到寄存器 a 中:
:%s/'user': '[a-Z]*'/\=setreg('A', submatch(0), 'V')/gn
并粘贴您的匹配项:
:put A
这至少需要 Vim 7.4(我忘记了实际的补丁号)。
答案2
“清除‘a’寄存器
qaq
“全局搜索并将所有行(‘A’)放入‘a’寄存器中。
:g/'user': '[a-Z]*'/y A
:g/ and /y A
根据需要修改之间的部分。
“粘贴到另一个文件中
"aP
答案3
您可以使用:YankMatches
我的命令ExtractMatches 插件:
:%YankMatches /'user': '[a-Z]*'/
默认情况下,每个匹配项都放在新行上;要使用其他分隔符,可以使用替代形式。
答案4
可能还有更好的方法(如果我们讨论的是大量条目,这些方法效率很低——只要不是成千上万,应该没问题),但我首先想到的是递归宏。首先,关闭 wrapscan 选项,这样到达文件末尾的搜索就不会再次循环到开头(否则您将陷入无限循环):
:set nowrapscan
然后,确保您有两个清晰的寄存器:
qqq
qaq
现在,魔术来了:
qq/'user': '[a-Z]*'
"Ay//e
@qq
qq
开始将所有击键记录到寄存器中q
。使用大写字母会使 vim 追加到该寄存器而不是覆盖它。y//e
拉到搜索的末尾。 @q
将(当前为空的)寄存器q
调用为宏,最后一个q
停止记录。然后,只需:
@q