说我有这样的行:
'alpha' 123
'beta' 678
'alpha' 998
'gamma' 212
Run Code Online (Sandbox Code Playgroud)
在VIM中使用搜索和替换正则表达式,将其转换为:
'alpha' 123 : alpha
'beta' 678 : beta
'alpha' 998 : alpha
'gamma' 212 : gamma
Run Code Online (Sandbox Code Playgroud)
基本上,搜索不会替换它正在搜索的内容,而只是将其用于其他内容.在我的脑海中,这应该工作:
:g/'\(.*\)'/s/$/: \1/g
Run Code Online (Sandbox Code Playgroud)
但那没有做到.我如何不消耗我正在搜索的内容但保留它以供使用?
g比赛的初始没有捕获替换; 它仅用于搜索分组.而是使用它,这也有点简单:
%s/'\(.*\)'.*/& : \1/
Run Code Online (Sandbox Code Playgroud)
的&内容替换一切,被匹配.
您可以直接在替代命令中执行此操作,使用\zs 对于构建零宽度匹配之类的东西非常有用(不会“消耗”)。
:%s/'\(.*\)'.*\zs/ : \1
Run Code Online (Sandbox Code Playgroud)
标志着\zs 比赛开始。这就像“比赛从这里开始”。因此,首先捕获括号的内容,然后 extra
.*匹配直到行尾的所有内容,然后 \zsnow 将匹配重置到该点,这意味着根本不是匹配的一部分,而是括号的内容被俘虏了。
:替换部分用和 匹配组替换行尾位置。