如何在jq中对对象数组执行反向子串匹配并获取对应id?
实现反向匹配:查找path为给定模式前缀的对象ID
你的需求是找出JSON数组中,path字段是传入模式的前缀的对象ID(比如传入/home/user/data时,匹配path: "/home/user"的对象),可以用以下两种方式实现:
方式一:使用startswith函数(推荐)
startswith是jq内置的字符串函数,直接用于判断字符串是否以指定前缀开头,无需处理正则转义,适合路径匹配场景。
完整命令示例
假设JSON数据保存在data.json文件中,传入匹配模式/home/user/data:
jq --arg pattern "/home/user/data" '.[] | select($pattern | startswith(.path)) | .id' data.json
命令解析
--arg pattern "/home/user/data":将目标模式作为参数传入jq,命名为$pattern.[]:遍历数组中的每个对象select($pattern | startswith(.path)):筛选出满足「传入模式以当前对象的path开头」的对象.id:输出匹配对象的id字段
执行后会输出1,符合预期结果。
方式二:使用正则表达式匹配
如果偏好正则方式,可以构造以path为前缀的正则表达式,实现相同效果:
jq --arg pattern "/home/user/data" '.[] | select($pattern | test("^" + .path)) | .id' data.json
注意事项
正则方式需要注意path中如果包含正则特殊字符(比如.、+等),需要额外转义,因此更推荐使用startswith函数。
内容的提问来源于stack exchange,提问作者xeruf
相关产品推荐
相关产品推荐

