首页 > 解决方案 > 使用前一行的缩进添加新行

问题描述

从现在开始,我一直在努力通过使用 sed 在新行中添加一个元素来更新一些 yaml 文件。

sed 命令(或另一个 linux 命令)必须匹配一个字符串(image:- image:),在新行上添加一个与前一行具有相同缩进的新元素。

问题是新行必须正好在字符串下方,image:而不是在- image:.

示例:当 sed 匹配字符串image时,它会添加具有正确缩进的新行(就在上面image

kind: DaemonSet
apiVersion: apps/v1
metadata:
  name: calico-node
spec:
  template:    
    spec:      
      containers:        
        - name: calico-node
          image: myimage    
          imagePullSecret: mysecret
...

示例 2:当 sed 匹配 string 时- image,它会添加具有正确缩进的新行(就在上面image而不是-):

kind: DaemonSet
apiVersion: apps/v1
metadata:
  name: calico-node
spec:
  template:    
    spec:      
      containers:
      - image: myimage    
        imagePullSecret: mysecret
...

不想要的是

kind: DaemonSet
apiVersion: apps/v1
metadata:
  name: calico-node
spec:
  template:    
    spec:      
      containers:
      - image: myimage    
      imagePullSecret: mysecret

我已经尝试过yq命令来处理这个问题,但这是一个巨大的痛苦......

- image我在另一个线程中找到了此代码,但在匹配字符串时它不起作用。

sed '/^ *image: .*/ { G; s/^\( *\)image: .*/&\1imagePullSecret: mysecret/; }' sed.yaml

标签: sedyamlindentation

解决方案


我不容忍使用sedto parse yaml,但如果你真的想这样做,你可以尝试这样的事情:

$ nl='                                                                                      
'
$ printf '   image:\n     - image:\n' | 
    sed -e "s/\(^\( *\)image:\)/\1\\$nl\2inserted text/" \
    -e "s/\(^\( *\)- image:\)/\1\\$nl\2  inserted text/"
   image:
   inserted text
     - image:
       inserted text

推荐阅读