如何在 vim 中搜索一个值,然后使用该值在同一行中进行搜索和替换?

How to search in vim for a value and then use the value to do search and replace in the same line?

我有以下几行,其中第一列是场景名称,后面是参数列表。

我想使用第 1 列值作为参数 scen= 的值,它可以在参数列表中的任何位置。

例如,如果我开始于:

InstallFull server1=solaris10 server2=solaris11 scen= email= disk=
InstallPartial server1=solaris20 server2=solaris21 email= scen= disk=
InstallMinimum server1=solaris30 server2=solaris32 disk= email= scen= 

我想这样结束:

InstallFull server1=solaris10 server2=solaris11 scen=InstallFull email= disk=
InstallPartial server1=solaris20 server2=solaris21 email= scen=InstallPartial disk=
InstallMinimum server1=solaris30 server2=solaris32 disk= email= scen=InstallMinimum

我使用了以下搜索并替换为反向引用语法:

:%s/\(.\{-\}\) \(.*\)\(scen=\)\(.*\)/   /gc

但我正在寻找更简单的方法。

也许有一种方法可以运行多个命令,其中第一个命令将搜索结果保存到一个变量中,第二个命令使用该变量进行搜索和替换。

我正在寻找 VI 单行命令,但如果这样的单行命令不存在,也欢迎使用函数。 :-)

谢谢。

RaamEE

一个(更短的)替代方案是 :global 使用普通模式命令,该命令抽出第一个单词,然后在 scen= 匹配之后附加它:

:global/scen=/normal! yenEp
%s/\v^(\w+).*/\=substitute(getline('.'),'scen=','&'.submatch(1),'g')/

这行看起来很长,但更容易理解。

P.s。如果您的线路有多个目标模式(此处为scen=

,则此线路有效

我会制作一个看起来像这样的宏。将光标放在第一行,

qq^"ayiw:s:\Vscen=:\= submatch(0) . @a

在这里按回车键。然后

jq

之后,只需按 @q 并输入您要执行的次数即可。如果你想做10次,10@q