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

如何基于条件使用JQ重新排序JSON中的RedisHost值?

解决不同Schema JSON文件中RedisHost字段的动态替换问题

核心思路

利用jq的递归遍历特性,不管RedisHost字段在JSON结构的哪个层级,精准定位并替换为指定顺序的主机字符串,全程保证JSON格式的合法性。

预设变量配置

先在Shell中定义好预设的主机顺序变量:

host_orderA="HOST-A;HOST-B"
host_orderB="HOST-B;HOST-A"

动态替换命令(按条件A/B)

条件A时的替换命令

针对任意包含RedisHost字段的JSON文件(比如File1.json/File2.json),执行以下命令:

# 输出到变量
result=$(jq --arg new_host "$host_orderA" 'walk(if type == "object" and .RedisHost then .RedisHost = $new_host else . end)' File1.json)

# 用sponge直接覆盖原文件(需先安装moreutils包)
jq --arg new_host "$host_orderA" 'walk(if type == "object" and .RedisHost then .RedisHost = $new_host else . end)' File1.json | sponge File1.json

条件B时的替换命令

只需把$host_orderA换成$host_orderB即可:

# 输出到变量
result=$(jq --arg new_host "$host_orderB" 'walk(if type == "object" and .RedisHost then .RedisHost = $new_host else . end)' File2.json)

# 用sponge覆盖原文件
jq --arg new_host "$host_orderB" 'walk(if type == "object" and .RedisHost then .RedisHost = $new_host else . end)' File2.json | sponge File2.json

关键说明

  • walk函数会递归遍历JSON的所有层级,自动适配不同Schema的文件,不用关心RedisHost的具体路径
  • --arg参数用于安全传递Shell变量到jq中,避免字符串转义问题
  • 使用sponge可以避免直接重定向(>)导致的文件清空问题,确保替换完成后再覆盖原文件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 07:28:18