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

时间:2015-03-01 19:30:48

标签: search vim replace vi

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

我想将第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=\)\(.*\)/\1 \2 \3\1 \4/gc

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

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

我正在寻找VI单线程命令,但如果不存在这样的单线程,也欢迎功能。 : - )

感谢。

RaamEE

3 个答案:

答案 0 :(得分:2)

一个(较短的)备选方案是:global,使用普通模式命令来抓取第一个单词,然后在scen=匹配后附加它:

:global/scen=/normal! yenEp

答案 1 :(得分:1)

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

这条线看起来很长但更容易理解。

P.S。如果您的行具有多个目标模式(此处为scen=

,则此行有效

答案 2 :(得分:1)

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

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

按此处输入。然后

jq

之后,只需点击@q您想要执行它的次数。如果你想这样做10次,10@q