GitLab流水线中多JSON转合并YAML列表的yq实现问题
GitLab流水线中合并多结构JSON为单YAML列表的yq优化方案
在GitLab流水线任务中,我有一批键结构不统一的JSON文件,需要将它们转换为YAML格式后合并到同一个YAML文件的指定根节点下,要求以去除后缀的文件名作为嵌套键。当前用yq处理后会生成多段独立的YAML文档,希望优化命令直接生成单列表结构,避免后续用awk二次处理。
示例输入JSON
文件1(nameOfTheJsonFile1.json):
{ "displayName": "Basic JSON 1", "dFilters": [], "description": "", "labels": { "overview": "", "specific": "", "team": "" }, "layout": {} }
文件2(nameOfTheJsonFile2.json):
{ "displayName": "Basic JSON 2", "cFilters": [], "description": "", "labels": { "overview": "", "specific": "", "team": "" }, "map": {} }
期望输出YAML
result: nameOfTheJsonFile1: displayName: Basic JSON 1 dFilters: [] description: '' labels: overview: '' specific: '' team: '' layout: {} nameOfTheJsonFile2: displayName: Basic JSON 2 cFilters: [] description: '' labels: overview: '' specific: '' team: '' map: {}
优化后的yq命令
使用mikefarah/yq v4+版本执行以下命令,可直接生成符合要求的单文档YAML:
yq eval-all ' reduce ( inputs | {"key": filename | split(".") | .[0], "value": .} ) as $item ( {}; .result[$item.key] = $item.value ) ' *.json > merged.yaml
命令说明
eval-all:告知yq处理所有输入的JSON文件inputs | {"key": filename | split(".") | .[0], "value": .}:对每个输入文件,生成包含两个字段的对象:key是去除后缀的文件名,value是JSON转换后的YAML内容reduce ... as $item ({}; .result[$item.key] = $item.value):遍历所有生成的对象,将它们合并到根节点result下,以key作为嵌套键
执行该命令后,所有JSON会被一次性转换并合并为单段YAML文档,无需额外的awk处理。
内容的提问来源于stack exchange,提问作者Zanndorin
相关产品推荐
相关产品推荐

