["a", "b", "c"], ["abc", "e", "f"]
给定以下 json 数据和“a”作为部分匹配的搜索词,如何使用 jq 获取包含部分匹配的搜索词“a”的数组?
[
["a", "b", "c"],
["abc", "e", "f"],
["g", "h", "i"]
]
jq '. [] | select(index("a"))'
只能得到完全匹配的结果,但我也["a", "b", "c"]
想得到,因为“abc”包含“a”。["abc", "e", "f"]
答案1
与以下略有不同的方法划艇拿走了什么:
jq 'map(select(any(contains("a"))))' file
最里面的测试测试每个字符串的 substring a
。如果子数组中的任何字符串包含a
,则选择该子数组。将map
选择应用于顶级数组中的所有子数组。
结果是一个顶级数组,其中的子数组至少包含一个包含子字符串 的元素a
:
[
[
"a",
"b",
"c"
],
[
"abc",
"e",
"f"
]
]
答案2
jq '[.[] | select(contains(["a"]))]'
使用您的输入数组:
$ jq -c << \\ '[.[] | select(contains(["a"]))]'
[
["a", "b", "c"],
["abc", "e", "f"],
["g", "h", "i"]
]
\
[["a","b","c"],["abc","e","f"]]
man jq
(https://stedolan.github.io/jq/manual/)有点长,但我认为相关部分是:
contains(b)
如果 b 完全包含在输入中,则过滤器将生成 true。如果 B 是 A 的子字符串,则字符串 B 包含在字符串 A 中。如果 B 中的所有元素都包含在 A 中的任何元素中,则数组 B 包含在数组 A 中。jq '包含(["baz", "bar"])' 输入[“foobar”,“foobaz”,“blarp”] 输出真