使用JQ从字符串更新JSON文件字段的问题求助
问题解决:替换JSON数组中对应city字段的值
场景说明
我有一个bash变量$string,其值为abc,def,还有一个file.json文件,内容如下:
[ { "loc": "51.12345, 12.12345", "city": "CityName1" }, { "loc": "65.12345, 15.12345", "city": "CityName2" } ]
希望将数组中每个对象的city字段替换为$string中的对应值,得到目标结果:
[ { "loc": "51.12345, 12.12345", "city": "abc" }, { "loc": "65.12345, 15.12345", "city": "def" } ]
尝试了以下代码但无法正常工作:
string="abc,def"; jq --arg variable "$string" '.city = $string' file.json
解决方案
你的代码问题在于:没有把传入的字符串分割成数组,也没有和JSON数组的元素一一对应。以下两种方法可以解决:
方法一:分割字符串后按索引匹配
string="abc,def"; jq --arg s "$string" '($s | split(",")) as $cities | .[] |= .city = $cities[index]' file.json
核心逻辑:
$s | split(",")把传入的字符串按逗号分割成数组["abc", "def"]- 将分割后的数组赋值给变量
$cities - 遍历原JSON数组的每个对象,用当前元素的索引取
$cities中对应的值替换city字段
方法二:转置数组配对元素(更简洁)
string="abc,def"; jq --arg s "$string" '[., ($s | split(","))] | transpose[] | .[0].city = .[1] | .[0]' file.json
核心逻辑:
- 把原JSON数组和分割后的城市数组合并成二维数组
transpose[]将二维数组转置,得到「原对象+对应城市值」的配对- 把配对中的城市值赋值给原对象的
city字段,最后只保留修改后的原对象,自动重组为数组
验证结果
运行上述任意命令后,输出的JSON内容会和目标结果完全一致。
内容的提问来源于stack exchange,提问作者maria
相关产品推荐
相关产品推荐

