jq 测试多个子字符串中的任何一个是否在字符串中

whe*_*den 1 iteration jq

假设我有一个这样的项目列表:

[
  "abcdef",
  "defghi",
  "euskdh"
]
Run Code Online (Sandbox Code Playgroud)

我想编写一个过滤器,返回包含“a”、“d”或“h”的所有项目。这是我能想到的最好的:

. as $val | select(any(["a", "d", "h"]; inside($val)))
Run Code Online (Sandbox Code Playgroud)

有没有什么方法可以不使用变量来做到这一点?

pea*_*eak 5

假设您的 jq 有正则表达式支持:

map(select(test("a|d|h")))
Run Code Online (Sandbox Code Playgroud)

或者如果你想要一个值流:

.[] | select(test("a|d|h"))
Run Code Online (Sandbox Code Playgroud)

如果您的 jq 没有正则表达式支持,那么如果它有 any/2,以下将产生一个值流:

.[] | select( any( index( "a", "d", "h"); . != null ) )
Run Code Online (Sandbox Code Playgroud)

其他一切都失败了,以下方法可以完成工作,但效率低下:

 .[] | select( [index("a", "d", "h")] | any )
Run Code Online (Sandbox Code Playgroud)