在 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: