【问题标题】:How to search in vim for a value and then use the value to do search and replace in the same line?如何在 vim 中搜索一个值,然后使用该值在同一行中进行搜索和替换?
【发布时间】:2015-05-02 02:42:35
【问题描述】:

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

我想将第一列的值用作参数 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

【问题讨论】:

  • @/ 变量包含最后一次搜索,所以这可能会有所帮助。
  • 感谢@EvergreenTree。 @/ 包含搜索正则表达式。在这种情况下我无法使用。

标签: search vim replace vi


【解决方案1】:

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

:global/scen=/normal! yenEp

【讨论】:

  • 谢谢。这样就可以了。
【解决方案2】:
%s/\v^(\w+).*/\=substitute(getline('.'),'scen=','&'.submatch(1),'g')/

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

附:如果您的线路有多个目标模式,则此行有效(scen= 此处)

【讨论】:

    【解决方案3】:

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

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

    在此处按输入。那么

    jq
    

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

    【讨论】:

      猜你喜欢
      • 2017-09-21
      • 2015-02-15
      • 2011-06-15
      • 2011-11-02
      • 2022-11-24
      • 2016-07-12
      • 1970-01-01
      • 1970-01-01
      • 2017-01-05
      相关资源
      最近更新 更多