【发布时间】: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
但我很难理解新语法。
非常感谢任何帮助。
【问题讨论】:
我正在尝试确定正确的语法,以便使用 yq 从使用 yq v4 的给定 yaml 输入中打印所有键/值对 - 所需的输出具有完整的键“路径”。使用 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(. == "*") 过滤标量值(即过滤掉 a 的值)(path | join(".")) 将路径作为数组获取,并将元素与 . 连接起来
{…: .} 创建一个映射,将连接的路径作为键,将它们的值作为值编辑:要在方括号中获取序列索引([0] 等),请执行
$ cat << EOF | yq e '.. | select(. == "*") | {(path | . as $x | (.[] | select((. | tag) == "!!int") |= (["[", ., "]"] | join(""))) | $x | join(".") | sub(".\[", "[")): .} ' -
这似乎应该有一个更简单的方法来做到这一点,但我不知道yq 足以弄清楚。
【讨论】:
[ 替换任何.[ 的命令,应该这样做。基本上你的sed 命令是做什么的。