VIM:根据下一行的上下文替换行

nnvyjq4y  于 2023-02-19  发布在  其他
关注(0)|答案(3)|浏览(152)

我有一堆文件,每个文件看起来像这样:

...
apiVersion: v1
kind: List
...
        apiVersion: v1
        kind: ConfigMap
...
apiVersion: v1
kind: DeploymentConfig
...
     apiVersion: "v1"
     kind: "PersistentVolumeClaim"
...
apiVersion: v1
kind: Service
...
  apiVersion: v1
  kind: DeploymentConfig
...

我想用apiVersion: apps.openshift.io/v1替换apiVersion: v1,但前提是下面的行与kind: DeploymentConfig匹配。
有没有办法用vim的原生功能来实现呢?
出于安全原因,我不能安装任何vim插件上的特定服务器。

vxbzzdmp

vxbzzdmp1#

一个解决方案是使用宏。

# start recording macro a
qa
# start searching
/kind: ConfigMap
# move up
k
# do replace
:.s/apiVersion: v1/apiVersion: apps.openshift.io\/v1/
# move down
j
# finish record
q

然后,您可以运行n@a和数字n来替换n次。

gopyfrb3

gopyfrb32#

对于:help :global来说,"在每一行匹配XXX的地方做一些事情"是一个理想的用例:

:g/kind: DeploymentConfig/-s/v1/apps.openshift.io/&/c

其中:

  • :g/<pattern>/<command>在匹配<pattern>的每一行上执行<command>
  • kind: DeploymentConfig是我们的<pattern>并且其余的是我们的<command>
  • -:help :s的地址,意思是"上面的行",
  • s/v1/apps.openshift.io/&apps.openshift.io\/v1代替v1(参见:h :s/\&),
  • 末端的/c是一个标志,告诉Vim提示确认每个取代,它是兼性的。
krcsximq

krcsximq3#

已经有两个很好的建议,但这里还有第三种方法:您可以匹配:substitute模式中的下一行。基本的搜索和替换可能如下所示:

:%s/apiVersion: v1/apiVersion: v2/g

如果你想说“并且下一行匹配某些特定的东西”,你可以用\ze结束目标模式,然后添加\_s\+来表示“任何空格,包括一个换行符”:

:%s/apiVersion: v1\ze\_s\+kind: DeploymentConfig/apiVersion: v2/g

\zs\ze模式非常适合于这样的特殊匹配,您也可以通过将开头锚定为\zs,在此上下文中仅将v1替换为v2

:%s/apiVersion: \zsv1\ze\_s\+kind: DeploymentConfig/v2/g

相关问题