如何防止 "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 进行测试。
我在 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 soyq
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 进行测试。