regex - 使用正则表达式的 JQ 搜索对象

标签 regex bash shell jq

我一直在玩JQ https://jqplay.org提取 JSON 数据,我看到了 test 操作,它允许我使用正则表达式来提取数据。在下面的示例运行中,我将正则表达式模式 "^progressive$" 传递到 test 中以搜索数据:

数据:

[
  {"genre": "progressive"},
  {"genre": "a progressive 1"}
]

查询:

map(select(.genre | test("^progressive$")))

结果:

[
  {
    "genre": "progressive"
  }
]

================================================== ===========================

现在,我想做与上面相反的事情。 JSON 中的 genre 值是我的正则表达式,我在 test 中传递的内容是我的数据。例如:

数据:

[
  {"genre": "^progressive$"},
  {"genre": "^abc$"}
]

查询:

我还没有弄清楚查询:(但我已经尝试过以下操作,但它没有返回我想要的或错误。

map(select("progressive" | test(.["genre"])))

预期结果:

[
  {
    "genre": "^progressive$"
  }
]

我不知道是否可以这样做,或者是否有人知道如何做。我正在考虑做一个很长的方法,它将循环遍历数组中的每个对象并提取 genre 值,然后与 progressive 进行比较。这是一条很长的路,它会起作用,但我很好奇是否有人知道更好、更有效的方法。

谢谢

最佳答案

以下似乎是您所追求的:

map(. as $in | select("progressive" | test($in|.["genre"])))

($in|.["genre"] 可以缩写为 $in.genre 但我留下了管道以使事情更清晰。)

注意我们如何使用。作为 $in 进行设置,以便我们可以使用适当的输入和参数调用 test

变化

少打字一点...

map(.genre as $g | select("progressive" | test($g)))

关于regex - 使用正则表达式的 JQ 搜索对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50032199/

相关文章:

linux - 访问perl中的默认目录

javascript - 有人可以解释这个电子邮件正则表达式的含义吗

linux:目录中的最新文件,不包括目录和 .文件

javascript - 为什么 $1...$9 属性 (RegExp) 不适用于 IE10?

linux - | 中的字符串值awk 中分隔字段被拆分到右侧

linux - 在 bash 脚本中转义冒号

linux - 如何在后台运行使用shell的linux应用程序?

c - 带有 C 预处理器指令的 Shell 脚本

php - 用于过滤具有破折号、空格、数字和某些单词的具有挑战性的字符串的正则表达式

C++ Regex 一个一个替换