微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

提取与 YAML 中的正则表达式匹配的键值对与布尔值 第 1 部分第 2 部分

如何解决提取与 YAML 中的正则表达式匹配的键值对与布尔值 第 1 部分第 2 部分

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

如果我有所有字符串,这个问题就有效,但是当我在 boolean 中有 yaml 值时它会失败。 Extract Key Value pairs which matches the regex in YAML using yq/sed/grep

我收到以下错误

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

解决方法

至少有两个非常不同的现存“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

del 版本的 jq 程序:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。