如何在 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
我有以下几行,其中第一列是场景名称,后面是参数列表。
我想使用第 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