行首单词和多行搜索的Sed问题

行首单词和多行搜索的Sed问题,sed,Sed,我有一个文本文件,在多个地方有以下文本: apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: harbor-exporter labels: release: mgmt 我想要: apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: harbor-exporter namespace

我有一个文本文件,在多个地方有以下文本:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: harbor-exporter
  labels:
    release: mgmt
我想要:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: harbor-exporter
  namespace: test
  labels:
    release: mgmt
由于此文本显示在文件中的多个位置,因此我确实需要搜索: 元数据:\n name:harbor exporter并追加行名称空间:test。接下来,元数据:应该出现在行的开头。使用sed实现这一目标的最佳方式是什么

我试过:

cat harbor-exporter.yaml | sed ':a;N;$!ba;s|metadata:\n  name: harbor-exporter|NewString|g'
但我确实需要元数据这个词:在一行的开头。所以我在元数据前面加了一个“^”:这是失败的

失败的命令:

cat harbor-exporter.yaml | sed ':a;N;$!ba;s|^metadata:\n  name: harbor-exporter|NewString|g'
谢谢

这可能适合您(GNU-sed):


在包含
元数据的行上进行匹配,打印它并获取下一行。如果该行不包含
name:harbor export
,请重新开始。否则,打印该行并将其替换为
名称空间:test

GNU-sed
上测试,不确定这是否需要对其他实现进行更改:如果
元数据:
不能在连续行中出现,则可以简化逻辑:

sed'/^metadata:$/{n;s/^name:harborexporter$/&\n命名空间:test/}
  • /^metadata:$/
    如果整行内容是
    元数据:
    • n
      fetch next line(模式空间被替换为新行)
    • s/^name:harbor exporter$/&\n名称空间:test/
      如果如此获取的下一行内容为
      name:harbor exporter

另外,您最好使用一个理解YAML的工具,例如

sed -E ':a;/metadata:/{n;/name: harbor-export/!ba;p;s/\S.*/namespace: test/}' file