如何使用jq根据匹配的文件路径获取对应用户列表?
问题解决:根据文件匹配路径获取对应用户
问题场景
给定路径-用户映射JSON:
[ { "path": "Module1/", "users": [ "john", "jane" ] }, { "path": "Module2/", "users": [ "mike", "mary" ] }, { "path": "Module3/", "users": [ "billy", "bonny" ] } ]
给定文件数组:
[ "Module1/file.java", "Module3/file.java" ]
需求:获取所有存在匹配路径的文件对应的用户,预期输出:
[ "john", "jane", "billy", "bonny" ]
原脚本问题
原脚本错误地用path去匹配文件名的正则,逻辑完全倒置——实际需要判断文件名是否以某个path为前缀,而非path是否匹配文件名。
修正后的脚本
users='[{"path":"Module1/","users":["john","jane"]},{"path":"Module2/","users":["mike","mary"]},{"path":"Module3/","users":["billy","bonny"]}]' files='["Module1/file.java","Module3/file.java"]' echo "$users" | jq --argjson files "$files" '[.[] | select(any($files[]; startswith(.path))) | .users[]]'
逻辑说明
- 使用
--argjson直接传入文件数组的JSON结构,避免字符串拼接正则的复杂操作和潜在错误 any($files[]; startswith(.path)):遍历所有文件,检查是否存在任意文件以当前条目的path作为前缀,满足条件则保留该路径条目- 提取所有符合条件的条目下的
users元素,展开为一维数组,得到预期结果
内容的提问来源于stack exchange,提问作者Cody
相关产品推荐
相关产品推荐

