yq v4:打印具有完整键路径的所有键值对

And*_*gar 2 yaml yq

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

$ cat << EOF | yq r -p pv - '**'
> a:
>   b: foo
>   c: bar
> EOF
a.b: foo
a.c: bar
Run Code Online (Sandbox Code Playgroud)

但我很难理解新语法。

任何帮助是极大的赞赏。

fly*_*lyx 10

$ cat << EOF | yq e '.. | select(. == "*") | {(path | join(".")): .} ' -\n> a:\n>   b: foo\n>   c: bar\n> EOF\na.b: foo\na.c: bar\n
Run Code Online (Sandbox Code Playgroud)\n

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

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

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

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

这似乎应该有一个更简单的方法来做到这一点,但我不太了解,无法yq弄清楚。

\n