shell jq选择比较不区分大小写

bttbmeg0  于 2023-03-13  发布在  Shell
关注(0)|答案(2)|浏览(229)

我有一个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"
                }
            }
        }
    ]
}

要获取id(some_id_1),我运行以下命令:

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"

正如您所看到的,name变量是“job_get_re_log”,但json中的名称是“job_get_re_Log”(大写L),这最终会失败,并且不会返回任何内容,因为它正在寻找一个完全匹配的对象。
如何修改select命令,使其在进行比较时不考虑大小写(不区分大小写)?

2mbi3lxu

2mbi3lxu1#

使用test()函数和if ... then ... else语句:

<file jq -r --arg w "$workspace" --arg e "$environment" --arg n "$name" \
      '.items[] | if ((.name | test($n; "i")) and (.workspace.name == $w) and (.workspace.environment.name == $e)) then .id else empty end'

利用给予test的标志"i"完成不敏感搜索。

czq61nw1

czq61nw12#

要使用test/1检查忽略大小写的相等性,必须锚正则表达式字符串。假设$name没有特殊的正则表达式字符:

jq -r --arg w "$workspace" --arg e "$environment" --arg n "$name" '
  .items[]
  | select( (.name | test("^\($n)$"; "i")) and
            (.workspace.name == $w) and
            (.workspace.environment.name == $e)) 
  | .id'

当然,使用test/1的要点是它可以处理ASCII范围之外的印刷大小写,例如:

$ jq 'test("Å";"i")' <<< '"å"'
true

正如@OguzIsmail所指出的,如果您希望使用test,即使$name可能包含regex特殊字符,也可以使用\Q...\E转义机制,如下所示:

$ jq 'test("\\Q.\\E")' <<< '"a"'
false

相关问题