5

Say I have lines like this:

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

And using the search & replace regex in VIM, turn it into this:

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

Basically, the search won't be replacing what it's searching for, but instead just using it for something else. In my head, this should work:

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

But that didn't do it. How do I not consume what I'm searching for but retain it for use?

4

4 回答 4

5

匹配的首字母g不捕获替换;它仅用于分组搜索。而是使用它,这也更简单一些:

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

&替换所有匹配的内容。

于 2013-04-22T16:26:48.950 回答
1

您可以直接在替换命令中执行此操作,使用\zs 对于构建诸如零宽度匹配(不“消耗”)之类的东西非常有用。

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

\zs 标志着比赛的开始。这就像“在这里开始比赛”。因此,首先捕获括号的内容,然后 extra .*匹配所有内容直到行尾,并且 \zsnow 将匹配重置到该点,这意味着根本不是匹配的一部分,而是括号的内容被抓获。

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

:h \zs

于 2013-04-22T16:31:12.617 回答
0

该命令应该可以工作:

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

(好吧,它在这里与您的示例文本一起使用)

于 2013-04-22T16:25:59.587 回答
0

宏也适用于您的示例:(未在 vim 中测试,但应该可以。)

光标在第一行的开头:

qqyi'A : <esc>pjq

那么x@q(x是你想做多少次)

于 2013-04-22T16:39:05.160 回答