【问题标题】:Extract Key Value pairs which matches the regex in YAML using yq/sed/grep使用 yq/sed/grep 提取与 YAML 中的正则表达式匹配的键值对
【发布时间】:2021-07-29 00:24:46
【问题描述】:

我在 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}} 的对用 - 分隔的值,我想保留它们

【问题讨论】:

  • 逻辑不通为什么要排除VAR-A、VAR-B、VAR-F/
  • @Inian 我想删除键名 (VAR-A) 在值 {{a.b.VAR-A}}(在 a.b. 之后)匹配的对,如果我的值超过 {{a.b.VAR-A}},则由 @987654330 分隔@ ,我想保留它们。
  • 我不认为这对 yq 来说很简单
  • @Inian 我们还有其他选择吗?

标签: regex shell sed grep yaml


【解决方案1】:

这是你所期望的吗?

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

【讨论】:

  • 是的,这正是我所期待的。但是,您可以解释一下您在使用 regex 做什么吗?
  • VAR-A 可以匹配到{{a.b.VAR-A}} 吗?
  • 当我们有像 VAR-F: True 这样的布尔值时,这会失败
猜你喜欢
  • 1970-01-01
  • 2018-03-09
  • 1970-01-01
  • 2015-07-02
  • 2015-10-03
  • 1970-01-01
  • 2023-01-23
  • 2020-11-14
  • 2014-09-06
相关资源
最近更新 更多