我有以下一组行,其中第一列是一个场景名称,后面跟着一个参数列表。
我想将第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
答案 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