如何用jq筛选compile_commands.json中路径匹配指定数组的条目
问题
处理CMake生成的compile_commands.json时,需要筛选出file字段路径与目标根路径数组中任意路径前缀匹配的条目。已通过main_target_path_array函数生成匹配用的路径数组,尝试用any()结合startswith()实现过滤,但startswith()不支持数组参数,现有代码无法正常工作:
main_target_path_array as $mainpaths | map(select( any( .file | startswith($mainpaths) ) ))
示例compile_commands.json数据:
[ { "directory": "/repository/build/build", "command": "/usr/bin/gcc -Wall -DMACRO_FOR_X1 -o src/lib/X_core1/CMakeFiles/X_core.dir/src/A.c.o -c src/lib/A.c", "file": "src/libAlpha/A.c" }, { "directory": "/repository/build/build", "command": "/usr/bin/gcc -Wall -DMACRO_FOR_Y1 -o src/lib/X_core2/CMakeFiles/Y_core.dir/src/A.c.o -c src/lib/A.c", "file": "src/libBeta/A.c" }, { "directory": "/repository/build/build", "command": "/usr/bin/gcc -Wall -DMACRO_FOR_Z1 -DBOBS_SPECIAL_MACRO -o src/lib/Z_core/CMakeFiles/Z_core.dir/src/A.c.o -c src/lib/A.c", "file": "src/libGamma/A.c" }, { "directory": "/repository/build/build", "command": "/usr/bin/gcc -Wall -DMACRO_FOR_Z1 -DBOBS_SPECIAL_MACRO -o src/lib/Z_core/CMakeFiles/Z_core.dir/src/B.c.o -c src/lib/B.c", "file": "src/lib/B.c" }, { "directory": "/repository/build/build", "command": "/usr/bin/gcc -Wall -DMACRO_FOR_X1 -o src/lib/X_core/CMakeFiles/X_core.dir/src/B.c.o -c src/lib/B.c", "file": "src/lib/B.c" }, { "directory": "/repository/build/build", "command": "/usr/bin/gcc -Wall -DMACRO_FOR_Z1 -DBOBS_SPECIAL_MACRO -o src/lib/Z_core/CMakeFiles/Z_core.dir/src/C.c.o -c src/lib/C.c", "file": "src/lib/C.c" } ]
假设main_target_path_array生成的匹配数组为:
["src/libAlpha/","src/libBeta/","src/libGamma/"]
解决方案
核心是调整any()的迭代逻辑,让它遍历目标路径数组中的每个元素,逐个检查是否是当前条目file字段的前缀。修改后的jq代码如下:
main_target_path_array as $mainpaths | map(select(any($mainpaths[]; .file | startswith(.))))
代码解释
$mainpaths[]:展开目标路径数组,让any()逐个迭代数组中的每个路径字符串.file | startswith(.):第二个.代表当前迭代到的路径字符串,检查file字段是否以该路径为前缀- 只要数组中有任意一个路径满足前缀匹配,
any()就返回true,对应的条目会被保留
验证结果
用给定的示例数据和匹配数组运行上述代码,会得到以下结果:
[ { "directory": "/repository/build/build", "command": "/usr/bin/gcc -Wall -DMACRO_FOR_X1 -o src/lib/X_core1/CMakeFiles/X_core.dir/src/A.c.o -c src/lib/A.c", "file": "src/libAlpha/A.c" }, { "directory": "/repository/build/build", "command": "/usr/bin/gcc -Wall -DMACRO_FOR_Y1 -o src/lib/X_core2/CMakeFiles/Y_core.dir/src/A.c.o -c src/lib/A.c", "file": "src/libBeta/A.c" }, { "directory": "/repository/build/build", "command": "/usr/bin/gcc -Wall -DMACRO_FOR_Z1 -DBOBS_SPECIAL_MACRO -o src/lib/Z_core/CMakeFiles/Z_core.dir/src/A.c.o -c src/lib/A.c", "file": "src/libGamma/A.c" } ]
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

