在 bash 中,如何在 yaml 文件中搜索和替换多行?
In bash, how can I search and replace over multiple lines in a yaml file?
我正在使用 bash shell。我有一系列格式如下的 YAML 文件
qa:
property1: abcdef
property2: xyzhijkl
…
production:
我想编写一个脚本来复制“qa”和“production”块之间的所有内容,将“qa”下的属性放入另一个“qa2”块中。以上将转换为
qa:
property1: abcdef
property2: xyzhijkl
…
qa2:
property1: abcdef
property2: xyzhijkl
…
production:
有没有办法编写 bash 脚本来进行搜索和替换?
使用yq的简单解决方案:
yq e '.qa2 = .qa' test.yaml
这将在生产后放置 qa2
,这无关紧要,因为根据 YAML 规范,它具有完全相同的语义。如果您仍然不喜欢它,请将它放在 production
之前,删除它并稍后再添加回来:
yq e '.production as $p | del(.production) | .qa2 = .qa | .production = $p' test.yaml
如果sed
是一个选项
$ sed -n '/^qa/,/^$/{P;s/^qa/qa2/;H;d};x;p;' input_file
qa:
property1: abcdef
property2: xyzhijkl
…
qa2:
property1: abcdef
property2: xyzhijkl
…
production:
我正在使用 bash shell。我有一系列格式如下的 YAML 文件
qa:
property1: abcdef
property2: xyzhijkl
…
production:
我想编写一个脚本来复制“qa”和“production”块之间的所有内容,将“qa”下的属性放入另一个“qa2”块中。以上将转换为
qa:
property1: abcdef
property2: xyzhijkl
…
qa2:
property1: abcdef
property2: xyzhijkl
…
production:
有没有办法编写 bash 脚本来进行搜索和替换?
使用yq的简单解决方案:
yq e '.qa2 = .qa' test.yaml
这将在生产后放置 qa2
,这无关紧要,因为根据 YAML 规范,它具有完全相同的语义。如果您仍然不喜欢它,请将它放在 production
之前,删除它并稍后再添加回来:
yq e '.production as $p | del(.production) | .qa2 = .qa | .production = $p' test.yaml
如果sed
是一个选项
$ sed -n '/^qa/,/^$/{P;s/^qa/qa2/;H;d};x;p;' input_file
qa:
property1: abcdef
property2: xyzhijkl
…
qa2:
property1: abcdef
property2: xyzhijkl
…
production: