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

yq v4: print all key value pairs with full key path

我正在尝试确定使用 yq 从使用 yq v4 的给定 yaml 输入打印所有 key/value 对的正确语法 - 所需的输出具有完整的键“路径”。这可以使用像这样的 v3:

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

但我很难理解新语法。

非常感谢任何帮助。

$ cat << EOF | yq e '.. | select(. == "*") | {(path | join(".")): .} ' -
> a:
>   b: foo
>   c: bar
> EOF
a.b: foo
a.c: bar

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

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

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

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

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