You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用jq遍历动态数组,在JSON文件中匹配子串并输出对应项?

解决方案:动态匹配子串筛选JSON条目

没问题,我来帮你搞定这个动态匹配的需求——毕竟硬编码肯定不适合动态生成的数组,jq其实有很灵活的方式处理这种场景。

核心思路

我们需要把动态生成的数组作为参数传递给jq,然后用jq的内置函数检查每个学生的Name是否包含数组中的任意一个子串,最后筛选出符合条件的条目。

具体步骤

1. 传递动态数组给jq

因为是数组类型,我们要用--argjson参数(而不是普通的--arg),它能直接接收JSON格式的数组,避免字符串解析的麻烦。

2. 编写jq筛选表达式

有两种常用的方式实现匹配:

方式一:用any()函数(直观易读)

any()函数会遍历我们传入的子串数组,只要当前条目的Name包含其中任意一个子串,就会返回true,从而被select()选中。

完整命令示例(假设你的JSON文件名为students.json):

jq --argjson substrings '["Bo","Al"]' 'map(select(any($substrings[]; .Name | contains(.))))' students.json
方式二:用正则匹配(适合复杂场景)

把动态数组的子串拼接成正则表达式的OR模式(比如Bo|Al),然后用test()函数匹配。这种方式适合需要正则特性(比如不区分大小写)的场景。

命令示例:

jq --argjson substrings '["Bo","Al"]' 'map(select(.Name | test($substrings | join("|"))))' students.json

如果需要不区分大小写,给test()加"i"标志:

jq --argjson substrings '["Bo","Al"]' 'map(select(.Name | test($substrings | join("|"); "i")))' students.json

动态生成数组的场景适配

如果你的子串数组是在脚本里动态生成的(比如shell脚本),可以先把数组转成JSON格式再传递:

# 动态生成子串数组
search_terms=("Bo" "Al")
# 转成JSON数组格式
json_terms=$(printf '%s\n' "${search_terms[@]}" | jq -R . | jq -s .)
# 执行筛选
jq --argjson substrings "$json_terms" 'map(select(any($substrings[]; .Name | contains(.))))' students.json

输出结果

运行上述命令后,你会得到符合条件的学生条目:

[
  {
    "Name": "Bob",
    "Grade": "Pass"
  },
  {
    "Name": "Alice",
    "Grade": "Fail"
  }
]

内容的提问来源于stack exchange,提问作者pnocti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 20:27:55