如何用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
相关产品推荐
相关产品推荐

