You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux Bash中如何用jq将JSON数组提取值转为单行列表?

提取JSON中服务镜像名称和标签为单行列表的最简方案

场景与需求

现有JSON文件 service-def-test.json,内容如下:

{
    "definition": {
        "services": [{
                "image": {
                    "name": "img1",
                    "tag": "2.0.1"
                }
            }, {
                "image": {
                    "name": "img2",
                    "tag": "1.4.0"
                }
            }, {
                "image": {
                    "name": "img3",
                    "tag": "1.2.5"
                }
            }
        ]
    }
}

需要将其中services数组内的image.name和image.tag分别提取为单行列表格式,方便后续导出为Shell变量:

images=[img1, img2, img3]
tags=[2.0.1, 1.4.0, 1.2.5]

当前使用jq命令仅能提取多行结果:

jq -r .definition.services[].image.name service-def-test.json

输出为:

img1
img2
img3

最简实现方案

方案1:纯jq直接生成目标格式

无需额外工具,用jq的字符串拼接和join函数直接输出需要的格式:

jq -r '
"images=[" + (.definition.services[].image.name | join(", ")) + "]",
"tags=[" + (.definition.services[].image.tag | join(", ")) + "]"
' service-def-test.json

执行后直接输出:

images=[img1, img2, img3]
tags=[2.0.1, 1.4.0, 1.2.5]

如果需要直接将结果赋值为Shell变量,可以用eval配合:

eval $(jq -r '
"images=[\(.definition.services[].image.name | join(", "))]",
"tags=[\(.definition.services[].image.tag | join(", "))]"
' service-def-test.json)

执行后即可在当前Shell环境中使用$images和$tags变量。

方案2:jq+Shell工具快速转换

如果偏好先用jq提取多行结果,再用简单Shell工具转成单行,推荐用paste命令:

# 生成images变量
images="[$(jq -r .definition.services[].image.name service-def-test.json | paste -sd ", " -)]"
# 生成tags变量
tags="[$(jq -r .definition.services[].image.tag service-def-test.json | paste -sd ", " -)]"

# 验证输出
echo $images
echo $tags

paste -sd ", " -的作用是将多行输入用", "连接成单行,再拼接前后方括号即可得到目标格式。


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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 04:55:16