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)) )