【问题标题】:JQ selecting multiple conditions where one is substringJQ选择多个条件,其中一个是子字符串
【发布时间】:2021-06-29 17:46:03
【问题描述】:

我进行了大量搜索,发现的大多数回复都很接近,但不是我想要的。用这个解析一个 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 来说是新的东西......

【问题讨论】:

标签: json select match jq


【解决方案1】:

您缺少一对括号。此外,使用--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)) )

【讨论】:

  • 谢谢!所以看起来我有正确的命令,只是格式不正确。感谢您提供有关传递变量的提示,这肯定会派上用场!再次感谢!关于转储 cat 命令的好技巧...
猜你喜欢
  • 2016-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-12
  • 1970-01-01
  • 2018-05-25
  • 2013-05-20
相关资源
最近更新 更多