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

如何修改jq的select命令实现大小写不敏感匹配以获取JSON中的ID?

实现jq不区分大小写的匹配查询

问题场景

现有如下JSON数据结构:

{
    "items": [
        {
            "id": "some_id_1",
            "name": "job_get_re_Log",
            "type": "standard",
            "workspace": {
                "id": "some_id_2",
                "name": "Shared",
                "description": "",
                "type": "custom",
                "environment": {
                    "id": "some_id_3",
                    "name": "DEV"
                }
            }
        }
    ]
}

原本使用以下bash命令提取目标id:

name="job_get_re_log"
workspace="Shared"
environment="DEV"

id=$(echo $jsonFile | jq -r ".items[] | select(.name == \"$name\" and .workspace.name == \"$workspace\" and .workspace.environment.name == \"$environment\").id")

echo "$id"

由于JSON中name字段值为job_get_re_Log(字母L大写),而变量name的值是job_get_re_log(字母l小写),精确匹配无法返回结果,需要修改select条件实现不区分大小写的比较。

解决方案

利用jq的ascii_downcase(转换为ASCII小写)或downcase(支持Unicode小写转换)函数,将待比较的双方统一转换为相同大小写后再做匹配。同时推荐使用--arg参数传递bash变量,避免引号转义问题。

修改后的命令

name="job_get_re_log"
workspace="Shared"
environment="DEV"

id=$(echo "$jsonFile" | jq -r --arg target_name "$name" --arg target_workspace "$workspace" --arg target_env "$environment" '
    .items[] | 
    select(
        (.name | ascii_downcase) == ($target_name | ascii_downcase) and 
        .workspace.name == $target_workspace and 
        .workspace.environment.name == $target_env
    ).id
')

echo "$id"

关键说明

  • ascii_downcase:将字符串转换为ASCII小写,适合只包含英文字符的场景,兼容性好。
  • 如果需要处理包含非英文字符的大小写匹配,可替换为downcase函数(需确保jq支持Unicode处理)。
  • 使用--arg传递变量:避免手动转义双引号,同时防止注入风险,让命令更稳定可靠。

内容的提问来源于stack exchange,提问作者o.o

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 20:22:50