如何使用mikefarah/yq按顺序处理每个Release输出指定内容
问题:使用mikefarah/yq按Release顺序输出版本及对应变更内容
我有一个记录项目版本发布信息的YAML文件,希望用mikefarah版本的yq工具,实现按每个Release依次输出其名称、对应的新增内容、修复内容的目标。当前使用的命令输出顺序不符合预期,寻求正确的命令写法。
原始YAML文件内容
releases: - name: v0.1.0 changes: added: - Second feature (#4) fixed: - Second fix (#5) - name: v0.0.1 changes: fixed: - First fix (#3) security: - name: v0.0.1 changes: added: - Bootstrap the project (#1) - First feature (#2)
期望输出
v0.1.0 Second feature (#4) Second fix (#5) v0.0.1 First fix (#3) v0.0.1 Bootstrap the project (#1) First feature (#2)
当前使用的命令及问题
命令
.releases[] | ( .name, .changes.added[], .changes.fixed[] )
当前输出
v0.1.0 v0.0.1 v0.0.1 Second feature (#4) Bootstrap the project (#1) First feature (#2) Second fix (#5) First fix (#3)
当前问题:命令会先输出所有Release名称,再输出所有新增内容,最后输出所有修复内容,无法按单个Release依次输出对应信息。
解决方案
问题出在原命令的遍历逻辑:它会先批量输出所有.releases[].name,再批量遍历所有.releases[].changes.added[],最后批量遍历所有.releases[].changes.fixed[],没有在单个Release的上下文内完成完整输出。
正确的命令需要对每个Release单独处理,在单个Release的范围内先输出名称,再依次输出其added和fixed的内容。同时要处理某些Release可能缺少added或fixed字段的情况,用// []将不存在的字段转为空数组,避免执行报错。
正确命令
.releases[] | ( .name, (.changes.added // [])[], (.changes.fixed // [])[] )
输出验证
执行该命令后,会得到与期望完全一致的输出:
v0.1.0 Second feature (#4) Second fix (#5) v0.0.1 First fix (#3) v0.0.1 Bootstrap the project (#1) First feature (#2)
内容的提问来源于stack exchange,提问作者Sébastien MICHOY
相关产品推荐
相关产品推荐

