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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 09:20:39