首页 > 解决方案 > 使用 yq/sed/grep 提取与 YAML 中的正则表达式匹配的键值对

问题描述

我在 YAML 输入下面有这个,我正在尝试使用yq

输入:

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: '{{a.b.VAR-F}}'

预期输出:

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}}'

我的尝试:

yq eval 'del( .[] | select (. == "{{a.b.*" ) )' abc.yaml

我是新手yq,任何帮助将不胜感激。

基于@Inian 的评论

**注意:我想删除值 {{abVAR-A}} (在 ab 之后)中的键名(VAR-A)匹配的对,并且如果我的值中有多个由 - 分隔的 {{abVAR-A}} ,我想保留它们

标签: regexshellsedgrepyaml

解决方案


这是你所期望的吗?

yq eval 'del(.[] | select(sub("^{{a\.b\.[^}]+}}$","")=="" ))' abc.yaml

正则表达式^{{a\.b\.[^}]+}}$匹配单个 {{...}} 结构,因为^$在开头和结尾。[^}]表示不是 的任何字符}

然后用空字符串替换,如果结果又是空字符串,则选择删除。

如果您只想匹配{{a.b.VAR-A}}

yq eval 'del(.[] | select(sub("^{{a\.b\.VAR-A}}$","")=="" ))' abc.yaml

推荐阅读