0

我在下面有这个YAML输入,我正在尝试使用yq. 我想删除(VAR-A)值中的键名{{a.b.VAR-A}}(在 之后a.b.)匹配的对,如果{{a.b.VAR-A}}值中的值由 分隔多个-,我想保留它们。

VAR-A: '{{a.b.VAR-A}}'
VAR-B: '{{a.b.VAR-B}}'
VAR-C: v0.0
VAR-D: '{{a.b.VAR-D}}-{{a.b.VAR-A}}'
VAR-E: '{{a.b.VAR-C}}-{{a.b.VAR-B}}-{{a.b.VAR-A}}'
VAR-F: True

预期输出:

VAR-C: v0.0
VAR-D: '{{a.b.VAR-D}}-{{a.b.VAR-A}}'
VAR-E: '{{a.b.VAR-C}}-{{a.b.VAR-B}}-{{a.b.VAR-A}}'
VAR-F: True

如果我有所有字符串,这个问题就有效,但是当我booleanyaml. 使用 yq/sed/grep 提取与 YAML 中的正则表达式匹配的键值对

我得到以下错误:

错误:不能用 !!bool 替换,只能替换字符串。提示:大多数情况下,您会希望在此操作中使用 '|=' 而不是 '='。

4

1 回答 1

1

至少有两个非常不同的现存“yq”项目:一个基于 Python 的项目,这是下面第 1 部分的重点,以及一个基于 Go 的项目,这是第 2 部分的重点。

第1部分

python-yq 'del(.[] | select( ( type == "string" and test("^{{a[.]b[.][^}]*}}$" ))))' so-vars.yaml

或者

python-yq  'map_values( select( ( type == "string" and test("^{{a[.]b[.][^}]*}}$" )) | not))' so-vars.yaml

输出:

{
  "VAR-C": "v0.0",
  "VAR-D": "{{a.b.VAR-D}}-{{a.b.VAR-A}}",
  "VAR-E": "{{a.b.VAR-C}}-{{a.b.VAR-B}}-{{a.b.VAR-A}}",
  "VAR-F": true
}

第2部分

我拥有的基于 Go 的 yq 版本(4.6.3)可能无法直接处理您的要求,但这里有一个解决方案,它使用此 yq 与 JSON 进行转换,并使用来完成其余的工作:

yq -j eval . input.yaml |
  jq  'del(.[] | select(( type == "string" and test("^{{a[.]b[.][^}]*}}$" ))))' > tmp.json
yq -P eval . tmp.json

deljq 程序的-free 版本:

map_values( select( type == "string" and test("^{{a[.]b[.][^}]*}}$" | not)

输出:

VAR-C: v0.0
VAR-D: '{{a.b.VAR-D}}-{{a.b.VAR-A}}'
VAR-E: '{{a.b.VAR-C}}-{{a.b.VAR-B}}-{{a.b.VAR-A}}'
VAR-F: true
于 2021-05-27T02:52:07.713 回答