行首单词和多行搜索的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