如何在yq v3中使用自引用完成YAML嵌套字段转换?
在yq v3中实现嵌套YAML字段的扁平化转换
先直接给你最简洁的解决方案:用yq eval(缩写yq e)命令替代yq write,它的语法更贴近jq,能完美实现你需要的自引用替换需求。
正确命令
针对你的YAML结构,执行以下命令就能得到目标结果:
cat config.yaml | yq e '.[] |= .desc.value' -
命令拆解
.[]:遍历顶层的所有键(也就是a、b这类节点)|=:表示将当前节点的值,替换为后面表达式计算出的结果.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




