jq访问带连字符的JSON字段报错,求修改diff脚本
修复JQ访问带特殊字符键的脚本错误
错误原因
def.args-pod中的args-pod包含连字符(-),JQ的点语法(.)会将其误解析为表达式(比如尝试调用pod函数或进行减法运算),导致触发pod/0 is not defined的错误。而args1、args2、def.car的键名无特殊字符,点语法可正常解析。
解决方案
方法1:使用JQ内置getpath函数(推荐)
利用getpath函数接收路径数组的特性,将点分隔的参数转换为字符串数组,直接定位目标值,无需处理特殊字符:
# 将参数转换为JQ可识别的路径数组 jq_path_array=$(echo "$param" | jq -R 'split(".")') # 执行diff对比 diff_output=$(diff <(jq --argjson path "$jq_path_array" 'getpath($path)' "$path_to_file1") <(jq --argjson path "$jq_path_array" 'getpath($path)' "$path_to_file2"))
方法2:用sed转换参数格式
通过sed将点分隔的参数转换为["键1"]["键2"]的索引格式,避免JQ误解析特殊字符:
# 将参数转换为JQ兼容的索引语法 jq_formatted_path=$(echo "$param" | sed -E 's/([^.]+)/["\1"]/g') # 执行diff对比 diff_output=$(diff <(jq "$jq_formatted_path" "$path_to_file1") <(jq "$jq_formatted_path" "$path_to_file2"))
验证
两种方法都能正确处理所有参数:
args1→ 转换后为["args1"]或路径数组["args1"],JQ可正常访问对应值def.car→ 转换后为["def"]["car"]或路径数组["def","car"],正确访问嵌套对象def.args-pod→ 转换后为["def"]["args-pod"]或路径数组["def","args-pod"],正确识别带连字符的键
内容的提问来源于stack exchange,提问作者user22667148
相关产品推荐
相关产品推荐

