如何使用jq过滤器在JSON文件中查找替换指定字段值
原命令错误点
- 表达式逻辑错误:使用
|直接输出.ingress.args.params[]的遍历结果,会打散原有完整JSON结构,最终只会输出params数组下的单个对象,丢失外层的idsb、data等所有其他字段。 - 赋值逻辑错误:给value赋值时额外套了一层
[],会把目标值从字符串转成数组类型,和预期的字符串格式不符。 - 变量传递方式错误:直接在jq表达式字符串里拼接shell变量
${var1},会因为shell和jq的双重引号转义规则导致表达式语法错乱,变量值无法被正确解析。
正确实现方式
不要手动拼接jq表达式字符串,使用jq原生的--arg参数安全传递shell变量,从根源上避免转义问题,命令如下:
# 定义目标值变量 var1='["res"]' # 执行替换,输出完整修改后的JSON jq --arg newVal "$var1" '.ingress.args.params |= map(if .name == "srm" then .value = $newVal else . end)' env.json
如果使用jq 1.6及以上版本,需要直接修改原文件而不是输出到终端,可以加--in-place参数:
jq --in-place --arg newVal "$var1" '.ingress.args.params |= map(if .name == "srm" then .value = $newVal else . end)' env.json
命令说明:
--arg newVal "$var1"会把shell变量var1的值安全传入jq上下文,命名为$newVal,全程不需要手动处理转义,不会出现引号嵌套错误。- 使用
map遍历params数组,仅修改name为srm的对象的value字段,其余字段、其余对象全部保持原样,最终输出完整的JSON结构,不会丢失外层内容。 - 直接将
$newVal赋值给value字段,不需要额外包裹数组符号,赋值后的值类型、格式完全和预期一致。
内容的提问来源于stack exchange,提问作者Karamchand
相关产品推荐
相关产品推荐

