【问题标题】:yq v4: print all key value pairs with full key pathyq v4:打印具有完整键路径的所有键值对
【发布时间】:2022-04-28 17:14:30
【问题描述】:

我正在尝试确定正确的语法,以便使用 yq 从使用 yq v4 的给定 yaml 输入中打印所有键/值对 - 所需的输出具有完整的键“路径”。使用 v3 可以做到这一点,例如:

$ cat << EOF | yq r -p pv - '**'
> a:
>   b: foo
>   c: bar
> EOF
a.b: foo
a.c: bar

但我很难理解新语法。

非常感谢任何帮助。

【问题讨论】:

    标签: yaml yq


    【解决方案1】:
    $ cat << EOF | yq e '.. | select(. == "*") | {(path | join(".")): .} ' -
    > a:
    >   b: foo
    >   c: bar
    > EOF
    a.b: foo
    a.c: bar
    

    这是做什么的?让我们回顾一下:

    • .. 递归选择所有值
    • select(. == "*") 过滤标量值(即过滤掉 a 的值)
    • (path | join(".")) 将路径作为数组获取,并将元素与 . 连接起来
    • {…: .} 创建一个映射,将连接的路径作为键,将它们的值作为值

    编辑:要在方括号中获取序列索引([0] 等),请执行

    $ cat << EOF | yq e '.. | select(. == "*") | {(path | . as $x | (.[] | select((. | tag) == "!!int") |= (["[", ., "]"] | join(""))) | $x | join(".") | sub(".\[", "[")): .} ' -
    

    这似乎应该有一个更简单的方法来做到这一点,但我不知道yq 足以弄清楚。

    【讨论】:

    • 嗨,flyx,谢谢你。是否可以像这样在标准 yaml 查询路径中获取它 - a.b[0].name: testname a.b[0].state: teststate
    • @PonsonThankavel 我用你想要的代码更新了答案。顺便说一句,你会发现 YAML 规范中没有提到“yaml 查询路径”。我认为这种形式主要是和Spring boot结合使用的,这是将YAML转换成Java属性的方式,但是没有什么标准
    • 非常感谢...输出现在具有数组元素表示法,但它仍然在数组索引之前包含一个点 (.) 字符(如 a.b.[0].state)。是否有可能摆脱那个点字符(如 a.b[0].state).. 试图调整你的表达式,但无法弄清楚......
    • 像这样调整命令并使其与 sed 一起工作... $ cat
    • @PonsonThankavel 啊,是的,我错过了重点。我更新了用[ 替换任何.[ 的命令,应该这样做。基本上你的sed 命令是做什么的。
    猜你喜欢
    • 2016-04-22
    • 2021-06-11
    • 2011-12-04
    • 1970-01-01
    • 2014-05-04
    • 2020-05-24
    • 2013-02-15
    • 2018-04-23
    • 2018-05-16
    相关资源
    最近更新 更多