说我有这样的行:
'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
但那没有做到。我如何不消耗我正在搜索的内容但保留它以供使用?
答案 0 :(得分:5)
匹配的初始g
未捕获替换;它仅用于搜索分组。而是使用它,这也有点简单:
%s/'\(.*\)'.*/& : \1/
&
取代了匹配的所有内容。
答案 1 :(得分:1)
您可以使用\zs
直接在substitute命令中执行此操作
对于像零宽度匹配这样的东西非常有用(但事实并非如此)
“消耗”)。
:%s/'\(.*\)'.*\zs/ : \1
\zs
标志着比赛的开始。这就像“开始比赛
“所以,首先捕获括号的内容,然后是额外的
.*
匹配到行尾的所有内容,\zs
现在重置
到那一点的比赛,意味着根本不是比赛的一部分,但是
parens的内容被捕获。
替换部分用:
和替换行位置的末尾
匹配的小组。
答案 2 :(得分:0)
此命令应该有效:
:%s/\v'(\w*)'.*/\0 : \1
(好吧,它在这里用你的示例文本做了)
答案 3 :(得分:0)
宏也适用于你的例子:(没有在vim中测试,但是应该可以工作。)
光标位于第1行的开头:
qqyi'A : <esc>pjq
然后x@q
(x是你想要做多少次)