我知道,我可以抽出所有符合条件的行入寄存器A这样的:VIM猛拉正则表达式组的所有比赛到寄存器
:g/regex/y/A
但我似乎无法弄清楚如何抽出正则表达式匹配成组寄存器 - 答:
:g/\(regex\)/\1y A
(E10: \ should be followed by /, ? or &)
我知道,我可以抽出所有符合条件的行入寄存器A这样的:VIM猛拉正则表达式组的所有比赛到寄存器
:g/regex/y/A
但我似乎无法弄清楚如何抽出正则表达式匹配成组寄存器 - 答:
:g/\(regex\)/\1y A
(E10: \ should be followed by /, ? or &)
你可以用替代命令做到这一点。
:%s/regex/\=setreg('A', submatch(0))/n
这会将寄存器a附加到正则表达式匹配的任何地方。 n
标志将在沙箱中运行该命令,因此没有任何内容会被替换,但语句的副作用将会发生。
你可能想用
:let @a=''
首先清空寄存器。如果你只是想抓住比赛的一部分,你可以用\zs
和\ze
工作。您只需要为多个部分捕获组,或重新排序。
我ExtractMatches plugin提供(其中包括)方便:YankMatches
命令还支持更换:
:[range]YankMatches[!] /{pattern}/{replacement}/[x]
您也可以抽出两会上针对性的寄存器之间的所有匹配行。
通过示例的方式:
:11,21s/regex/\=setreg('A', submatch(0))/n
相配从管线11 regrex组到第21行,而不是整个文件。
:/^ab/,/^cd/s/regex/\=setreg('A', submatch(0))/n
相配从与ab
stards与cd
到线路的线路regrex基。
更多关于会议:http://vimregex.com/
会不会使用大写字母寄存在'setreg( 'A',子匹配(0))'是更容易? –
@PeterRincker是的,它会。我没有意识到它会接受大写字母(我也没有测试它......) – FDinoff
关于使用大写字母版本的好的部分是你可以使用'setreg()'的第三个参数来使它变成线条化的if你要。 '%s/foo/\ = setreg('A',submatch(0),'V')/ n' –