别再用 grep 搜代码了——ast-grep 用语法树把重构效率拉满

你有没有被 grep -r "console.log" 这种文本搜索坑过?搜出来一堆注释里的字符串、或者代码里的变量名,噪音比结果还多。

ast-grep 就是来解决这个问题的——它不是搜文字,而是搜代码的语法结构(AST)。你写一个代码模式,它帮你找到所有「长得像这段代码」的地方,连格式不一致的变体都能匹配上。


为什么普通 grep 不够用

grep 搜的是原始字节流,语法对它来说毫无意义。你想找所有「给 console.log 传的参数」,grep 会把字符串里的 "console.log" 也算进去,因为它根本不识字。

ast-grep 不一样。它先把代码 parse 成语法树,然后拿另一段真正的代码当模板去匹配——模板里用 $VAR 这种元变量标记「这里是什么都行」。f(x)f( x )、多行的 f(n xn) 全部命中同一个 $F($X) 模式,grep 做不到。

更狠的是它还能批量rewrite——把 var $N = $V 全部改成 let $N = $V,带 diff 预览,交互式确认,比sed安全100倍。


适用场景

代码重构:批量把旧写法换成新写法,所有格式变体一个命令搞定,不用写正则。

代码审查:搜「catch 里只有空语句」「没有 await 的 async 函数调用」这种语义问题,grep 根本无能为力。

批量替换:项目里有一百个文件要改,ast-grep 可以扫描 YAML 规则文件批量跑,比逐个手动改省太多时间。


怎么安装使用

# npm / pip / cargo 三种安装方式任选
npm install -g @ast-grep/cli
# 或者
pip install ast-grep
# 或者
cargo install ast-grep

# 搜索示例:搜所有 console.log 调用
ast-grep -p 'console.log($MSG)' src/

# 强制指定语言
ast-grep -p 'await $P' -l ts src/

# 批量rewrite:var → let
ast-grep -p 'var $N = $V' --rewrite 'let $N = $V' -l js src/

# 运行YAML规则
ast-grep scan --rule rules/no-eval.yml src/

pattern 里的 $变量名 必须大写,匹配单个节点;$$$ 匹配零个或多个节点。详情看 SKILL.md。


关联的 Claude Skill

GitHub 上 hughdbrown/claude-skills 仓库里有一个 ast-grep-skill,装上之后 Claude Code 遇到代码搜索任务会自动调用 ast-grep 而不是 grep——让 AI 做代码重构和语义分析时直接有结构化搜索的能力,非常适合团队内部推广。

GitHub:https://github.com/ast-grep/ast-grep
Skill仓库:https://github.com/hughdbrown/claude-skills/tree/main/ast-grep-skill


GitHub: https://github.com/ast-grep/ast-grep

评论区

0 条评论

登录后可评论。

陈一铭 10 阅读