JQ选择多个条件其中一个是子串
JQ selecting multiple conditions where one is substring
我进行了相当多的搜索,我找到的大部分回复都很接近,但不是我想要的。用这个解析 JSON 文件:
cat file.json | jq -r ".[] | select(.name == \"${VALUE}\" or .guid == \"${VALUE}\") | .name"
按预期工作,它选择 .name 或 .guid 等于 ${VALUE} 的项目并打印出名称。
但是,我希望 .guid 匹配是子字符串或正则表达式匹配。尝试这个不起作用:
cat file.json | jq -r ".[] | select(.name == \"${VALUE}\" or .guid | contains(\"${VALUE}\")) | .name"
我想我已经很接近了,只是缺少一些对 jq 来说是新的东西...
您缺少一对 parens。此外,通常使用 --arg
或 --argjson
或类似的方法传递变量要好得多。因此,鉴于 UUOC 和其他考虑因素,我会采用如下方式:
< file.json jq -r --arg VALUE "$VALUE" '
.[]
| select( (.name == $VALUE) or (.guid | contains($VALUE)) )
| .name'
或者,根据您的要求,您可能更愿意使用此 select
子句:
select( (.name == $VALUE) or (.guid // "" | contains($VALUE)) )
我进行了相当多的搜索,我找到的大部分回复都很接近,但不是我想要的。用这个解析 JSON 文件:
cat file.json | jq -r ".[] | select(.name == \"${VALUE}\" or .guid == \"${VALUE}\") | .name"
按预期工作,它选择 .name 或 .guid 等于 ${VALUE} 的项目并打印出名称。
但是,我希望 .guid 匹配是子字符串或正则表达式匹配。尝试这个不起作用:
cat file.json | jq -r ".[] | select(.name == \"${VALUE}\" or .guid | contains(\"${VALUE}\")) | .name"
我想我已经很接近了,只是缺少一些对 jq 来说是新的东西...
您缺少一对 parens。此外,通常使用 --arg
或 --argjson
或类似的方法传递变量要好得多。因此,鉴于 UUOC 和其他考虑因素,我会采用如下方式:
< file.json jq -r --arg VALUE "$VALUE" '
.[]
| select( (.name == $VALUE) or (.guid | contains($VALUE)) )
| .name'
或者,根据您的要求,您可能更愿意使用此 select
子句:
select( (.name == $VALUE) or (.guid // "" | contains($VALUE)) )