如何基于条件使用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
相关产品推荐
相关产品推荐

