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
还不够了解,无法弄清楚。
我正在尝试确定使用 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
还不够了解,无法弄清楚。