用途:ast-grep 用于按代码结构而非文本字节进行搜索与重写,适合“找出所有接收 Request 参数的函数”“把 console.log(x) 改写为 logger.info(x)”“跨仓库把 require 换成 import”“迁移 Optional[X] 到 X | None”等任务。若问题只依赖字符串内容、注释、文件名或跨语言正则,应改用文本搜索工具。
主要能力:支持 25 种语言;通配符为 $VAR(单个 AST 节点)与 $$$(零个或多个节点),不是正则;支持 YAML 规则扫描与自动修复;提供 sg run、sg scan、sg test、sg new、sg lsp 等命令。
使用方式:本技能提供 Python 封装 scripts/ast_grep_helper.py 及安装脚本 install.sh(POSIX)、install.ps1(Windows)。常用子命令:search 查找匹配,replace 默认干跑、加 --apply 才写入,scan 运行 YAML 规则,validate 离线校验模式,langs/doctor/install 辅助。直接使用 sg 的典型命令:sg run -p 'console.log($MSG)' --lang ts src/;改写加 -r 与 --update-all。shell 中模式必须用单引号,避免 $VAR 被展开。
限制与注意:模式必须是合法代码;--update-all 与 --json 互斥,需分两遍执行;重写前务必先干跑并检查影响文件数;stdin 模式必须显式指定 --lang;Linux 上 sg 可能与 util-linux 的 setgroups 冲突,建议用 ast-grep 或设置别名。
适用场景:结构化查找、批量 codemod、CI 中的 YAML 规则检查与自动修复。语义问题(变量指向、是否抛异常)应改用 LSP、类型检查器或 Semgrep。