提取与 YAML 中的正则表达式匹配的键值对和布尔值
Extract Key Value pairs which matches the regex in YAML with boolean values
我在 YAML
输入下面有这个,我正在尝试使用 yq
提取显示的输出。我想删除值 {{a.b.VAR-A}}
中键名 (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
如果我有所有的字符串,这个问题就有效,但是当我在 yaml
中有 boolean
值时,它就失败了。
我遇到以下错误:
Error: cannot substitute with !!bool, can only substitute strings. Hint: Most often you'll want to use '|=' over '=' for this operation.
至少有两个非常不同的现存“yq”项目:一个是基于 Python 的项目,这是下面第 1 部分的重点,另一个是基于 Go 的项目,这是第 1 部分的重点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 相互转换的解决方案,并且jq 做剩下的事:
yq -j eval . input.yaml |
jq 'del(.[] | select(( type == "string" and test("^{{a[.]b[.][^}]*}}$" ))))' > tmp.json
yq -P eval . tmp.json
jq程序的del
免费版:
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
我在 YAML
输入下面有这个,我正在尝试使用 yq
提取显示的输出。我想删除值 {{a.b.VAR-A}}
中键名 (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
如果我有所有的字符串,这个问题就有效,但是当我在 yaml
中有 boolean
值时,它就失败了。
我遇到以下错误:
Error: cannot substitute with !!bool, can only substitute strings. Hint: Most often you'll want to use '|=' over '=' for this operation.
至少有两个非常不同的现存“yq”项目:一个是基于 Python 的项目,这是下面第 1 部分的重点,另一个是基于 Go 的项目,这是第 1 部分的重点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 相互转换的解决方案,并且jq 做剩下的事:
yq -j eval . input.yaml |
jq 'del(.[] | select(( type == "string" and test("^{{a[.]b[.][^}]*}}$" ))))' > tmp.json
yq -P eval . tmp.json
jq程序的del
免费版:
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