如何在jq管道中调用外部bash脚本生成JSON字段值?
解决方案
1. 编写外部处理脚本
先创建可执行的bash脚本myscript.sh,负责接收model值并生成目标字符串:
#!/bin/bash # 接收第一个参数作为model值,输出计算后的字符串 echo "I am a computed value out of $1"
给脚本添加执行权限:
chmod +x myscript.sh
2. 用jq结合bash循环处理JSON
通过jq拆分原JSON的数组元素,循环调用脚本计算字段值后再重组结构,执行以下命令:
while read -r obj; do # 提取当前对象的model字段值 model=$(echo "$obj" | jq -r '.model') # 调用外部脚本获取计算结果 alt_value=$("./myscript.sh" "$model") # 给当前对象添加alternative_model字段 echo "$obj" | jq --arg alt "$alt_value" '.alternative_model = $alt' done < <(jq -c '.model[]' input.json) | jq -s '{model: .}'
3. 效果说明
假设你的输入JSON文件是input.json,内容为:
{"model": [{"id": "an-id","path": ["mypath1.txt"],"model": "foo"},{"id": "an-id2","path": ["mypath1.txt"],"model": "foo2"}]}
执行命令后会输出:
{ "model": [ { "id": "an-id", "path": ["mypath1.txt"], "model": "foo", "alternative_model": "I am a computed value out of foo" }, { "id": "an-id2", "path": ["mypath1.txt"], "model": "foo2", "alternative_model": "I am a computed value out of foo2" } ] }
注意事项
- 如果
model字段包含空格、引号等特殊字符,脚本中的"$model"会自动处理转义,避免出错。 - 确保
myscript.sh和input.json在当前工作目录下,或者使用绝对路径指定位置。
内容的提问来源于stack exchange,提问作者Rafag
相关产品推荐
相关产品推荐

