如何用yq为YAML节点添加父节点键作为license-owner值?
问题:用yq给YAML批量添加license-owner字段并保留完整结构
原始YAML文件
developers: bob: softwares: - yq: version: "1.2.3" - visual-studio-code: version: "1.2.3" john: softwares: - xcode: version: "1.2.3" - jq: version: "1.2.3"
预期修改结果
developers: bob: softwares: - yq: version: "1.2.3" license-owner: bob - visual-studio-code: version: "1.2.3" license-owner: bob john: softwares: - xcode: version: "1.2.3" license-owner: john - jq: version: "1.2.3" license-owner: john
错误尝试及问题
使用以下命令:
yq '.developers.* | .softwares[].*.license-owner = (. | key)' test.yml
得到的结果仅返回修改后的片段,丢失了完整的YAML结构:
softwares: - yq: version: "1.2.3" license-owner: bob - visual-studio-code: version: "1.2.3" license-owner: bob softwares: - xcode: version: "1.2.3" license-owner: john - jq: version: "1.2.3" license-owner: john
解决方法
问题根源是使用了|管道操作符,它会直接输出过滤后的节点,而非修改原结构后返回完整文档。需要改用|=更新操作符,确保修改后保留整个YAML结构。
正确命令(适用于mikefarah/yq v4+)
yq '.developers[] |= (.softwares[] |= (.[] |= .license-owner = (path | .[-3])))' test.yml
更简洁的写法
yq '.developers.*.softwares[].* |= .license-owner = (path | .[1])' test.yml
逻辑说明
.developers.*遍历每个开发者节点.softwares[].*遍历每个软件条目下的具体软件对象|=是更新操作符,确保修改后保留原文档的完整层级path | .[1]获取当前开发者的键名(如bob、john),作为license-owner的值
运行上述命令后,即可得到符合预期的完整YAML结构。
内容的提问来源于stack exchange,提问作者Sébastien MICHOY
相关产品推荐
相关产品推荐

