如何修改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
相关产品推荐
相关产品推荐

