如何防止 "yq" 用“!!merge”语句替换我的文本?

How do I prevent "yq" from replacing my texet wiht a "!!merge" statement?

我在 Rails 4 应用程序中使用了一个 YAML 文件,

default: &default
  key: <%= JSON.parse(ENV[‘data’])[‘key'] %> 
  secret: <%= JSON.parse(ENV[‘data’])[‘secret’] %> 

development:
  key: 1234
  Secret: 1234

test:
  key: 1234
  Secret: 1234

qa:
  <<: *default

production:
  <<: *default

我想 运行 一个脚本来复制块“qa”,以便在它下面有一个相同的“qa2”块。理想情况下,最终结果将是

default: &default
  key: <%= JSON.parse(ENV[‘data’])[‘key'] %> 
  secret: <%= JSON.parse(ENV[‘data’])[‘secret’] %> 

development:
  key: 1234
  secret: 1234

test:
  key: 1234
  secret: 1234

qa:
  <<: *default

qa2:
  <<: *default

production:
  <<: *default

并得到了这个命令

yq e '.production as $p | del(.production) | .qa2 = .qa | .production = $p' config/myfile.yml

但这会产生

default: &default
  key: <%= JSON.parse(ENV['data'])['key'] %>
  secret: <%= JSON.parse(ENV['data'])['secret'] %>
development:
  key: 1234
  secret: 1234
test:
  key: 1234
  secret: 1234
qa:
  !!merge <<: *default
qa2:
  !!merge <<: *default
production:
  !!merge <<: 

有没有一种方法可以重写一些东西,这样我就不会插入令人讨厌的“!!merge”关键字?

来自manual

yq supports merge aliases (like <<: *blah) however this is no longer in the standard yaml spec (1.2) and so yq will automatically add the !!merge tag to these nodes as it is effectively a custom tag.

要删除此自定义标签,请执行您的操作,然后使用 (... | select(tag == "!!merge")) tag = "" 作为最后的操作。它将取消标记任何标记为 !!merge.

的项目
yq e '
  .production as $p | del(.production) | .qa2 = .qa | .production = $p
  | (... | select(tag == "!!merge")) tag = ""
' config/myfile.yml
default: &default
  key: <%= JSON.parse(ENV[‘data’])[‘key'] %>
  secret: <%= JSON.parse(ENV[‘data’])[‘secret’] %>
development:
  key: 1234
  Secret: 1234
test:
  key: 1234
  Secret: 1234
qa:
  <<: *default
qa2:
  <<: *default
production:
  <<: *default

或者,您也可以直接取消标记 .qa.qa2.production

yq e '
  .production as $p | del(.production) | .qa2 = .qa | .production = $p
  | ((.qa, .qa2, .production) | ...) tag = ""
' config/myfile.yml

使用 mikefarah/yq 4.14.1 和 4.20.2 进行测试。