You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在yq v3中使用自引用完成YAML嵌套字段转换?

在yq v3中实现嵌套YAML字段的扁平化转换

先直接给你最简洁的解决方案:yq eval(缩写yq e)命令替代yq write,它的语法更贴近jq,能完美实现你需要的自引用替换需求。

正确命令

针对你的YAML结构,执行以下命令就能得到目标结果:

cat config.yaml | yq e '.[] |= .desc.value' -

命令拆解

  • .[]:遍历顶层的所有键(也就是ab这类节点)
  • |=:表示将当前节点的值,替换为后面表达式计算出的结果
  • .desc.value:取当前节点下嵌套的desc.value字段的值,完成自引用赋值

执行后你的YAML会被转换成:

a: 1
b: 2

为什么之前的yq w命令失效?

你之前尝试的yq w - "*" "*.value"之所以得到a: *.value这种错误结果,是因为yq write命令的定位是静态赋值——它会把你传入的第二个参数当成字面量字符串直接写入,不会解析成YAML路径表达式。换句话说,它根本不会把*.value理解为“当前节点的value字段”,只会把它当作普通字符串赋值给每个顶层键。

(可选)用yq w实现的繁琐方式

如果一定要用yq write命令,只能通过bash循环逐个处理每个顶层键,先读取对应的值再写入:

# 遍历所有顶层键
for key in $(yq e 'keys | .[]' config.yaml); do
  # 读取当前键对应的desc.value值
  value=$(yq e ".$key.desc.value" config.yaml)
  # 写入到当前键(-i表示直接修改原文件)
  yq w -i config.yaml "$key" "$value"
done

不过这种方法步骤繁琐,还会直接修改原文件,远不如yq e的写法高效简洁。

内容的提问来源于stack exchange,提问作者ethanabrooks

火山引擎 最新活动