搜索和替换而不消耗您正在搜索的内容

时间:2013-04-22 16:21:23

标签: regex vim

说我有这样的行:

'alpha' 123 
'beta' 678
'alpha' 998
'gamma' 212

使用搜索&在VIM中替换正则表达式,将其转换为:

'alpha' 123 : alpha
'beta' 678 : beta
'alpha' 998 : alpha
'gamma' 212 : gamma

基本上,搜索不会替换它正在搜索的内容,而只是将其用于其他内容。在我看来,这应该有效:

:g/'\(.*\)'/s/$/: \1/g

但那没有做到。我如何不消耗我正在搜索的内容但保留它以供使用?

4 个答案:

答案 0 :(得分:5)

匹配的初始g未捕获替换;它仅用于搜索分组。而是使用它,这也有点简单:

%s/'\(.*\)'.*/& : \1/

&取代了匹配的所有内容。

答案 1 :(得分:1)

您可以使用\zs直接在substitute命令中执行此操作 对于像零宽度匹配这样的东西非常有用(但事实并非如此) “消耗”)。

:%s/'\(.*\)'.*\zs/ : \1

\zs标志着比赛的开始。这就像“开始比赛 “所以,首先捕获括号的内容,然后是额外的 .*匹配到行尾的所有内容,\zs现在重置 到那一点的比赛,意味着根本不是比赛的一部分,但是 parens的内容被捕获。

替换部分用:和替换行位置的末尾 匹配的小组。

:h \zs

答案 2 :(得分:0)

此命令应该有效:

:%s/\v'(\w*)'.*/\0 : \1

(好吧,它在这里用你的示例文本做了)

答案 3 :(得分:0)

宏也适用于你的例子:(没有在vim中测试,但是应该可以工作。)

光标位于第1行的开头:

qqyi'A : <esc>pjq

然后x@q(x是你想要做多少次)