【问题标题】:Check for a random element in an array and return it if true检查数组中的随机元素,如果为真则返回
【发布时间】:2020-01-13 13:06:49
【问题描述】:

我有几个不同长度的数组,其中可能包含一个以foo 开头的元素(名称长度也不同),如果这个元素存在我想返回它,例如foo-f-o-o.

我知道如何检查它的存在,我成功测试了

{
    "arr": [
        "foo-f-o-o", "bar", "baz", "qux", "quux", "corge", "grault"
    ]
}

使用命令type file.json | jq ".arr|contains([\"foo\"])",我正确收到了true

但是,我正在寻找这些步骤:

  1. 检测元素foo*是否存在
  2. 如果,则返回该元素的名称,在给定的情况下:foo-f-o-o
  3. 如果不是,返回false

元素 foo.* 可以位于数组的任何位置,这意味着像 jq -r ".arr|.[0]" 这样的元素在这里不是一个选项。

有没有办法在 jq 中应用像 /^foo.*/ 这样的正则表达式来匹配值?

【问题讨论】:

  • 供您考虑,这里有一个 alternative(即非 jq)解决方案,用于您的查询中的 JSON 操作,基于 unix walk-path 实用程序jtc<arr.json jtc -w'[arr]:<>i:<$0:false>f>^foo.*<R' -T'{{$0}}'。如果您有兴趣,我可以在单独的答案中详细说明该工具的使用(PS。我是该工具的开发人员)。

标签: arrays json batch-processing jq conditional-operator


【解决方案1】:

对于这种特殊情况,您不需要正则表达式,请使用 startswith:

first(.arr[] | select(startswith("foo"))) // false

如果你需要所有匹配的元素:

(.arr[] | select(startswith("foo"))) // false

【讨论】:

  • dabbl0r - 如果你想指定一个正则表达式,你可以使用 test/1,例如test("^foo")
猜你喜欢
  • 1970-01-01
  • 2017-09-17
  • 2015-04-27
  • 2019-09-28
  • 1970-01-01
  • 2018-07-12
  • 2016-05-03
  • 2023-04-06
  • 2017-04-01
相关资源
最近更新 更多