ast-grep vs. ripgrep

ripgrep 就像快速浏览一本书。ast-grep 就像理解其背后的语法。两者各有用途。使用 ripgrep 可以快速解决问题,而 ast-grep 则适合那些不能出错的情况。

ast-grep vs. ripgrep

如果您曾经处理过大型代码库,您可能遇到过这种情况:您使用 grep 或 rg 查找模式,结果搜索结果突然爆出大量注释、字符串或测试模拟中的无用匹配项。

您滚动几分钟才能找到一行真正的代码。

这时您开始希望您的搜索工具能够真正理解代码。这正是 ast-grep 的功能。

1、简述

ripgrep (rg) — 非常适合快速的文本搜索。

ast-grep — 非常适合结构化、语法感知型搜索。

一个像金属探测器,另一个像 CT 扫描。

2、ripgrep:快速简便

ripgrep 是我们常用的命令行工具。当您需要快速查找文本时,它堪称完美之选。

示例:

rg -n 'console\.log\(' -t js

您将立即看到所有包含 console.log( 的行。无需设置,无需等待。

这对于快速检查非常有用,例如查找日志、待办事项或配置项。但它无法区分代码和注释掉的代码。

3、ast-grep:理解代码

ast-grep 则截然不同。它不只是搜索文本,而是将您的代码解析为抽象语法树 (AST)。基本上,它以与编译器相同的方式理解您的程序。

这意味着:

ast-grep run -l TypeScript -p 'import $X from "$P"'

此命令检测实际的 import 语句,而不是字符串或注释中的随机单词。这就是语法感知搜索和语法盲搜索之间的区别。

4、何时使用它们

让我们保持简单。

目标 工具 为什么
需要快速文本搜索 ripgrep 快速便捷
需要结构化结果 ast-grep 识别代码语法
两者兼备 两者皆可 ripgrep 速度快,ast-grep 准确

5、无悔重构

ast-grep 的真正优势在于代码转换。

假设你想将所有 var 声明替换为 let。你可以尝试全局查找替换,但这很冒险。它会影响类似这样的注释:

// don't use var anymore

使用 ast-grep,就安全多了:

ast-grep run -l JavaScript -p 'var $A = $B' -r 'let $A = $B' -U

现在它只会修改真正的 var 语句。没有误报,没有破坏代码。

这就是使用抽象语法树 (AST) 的优势——这个工具区分代码和非代码。

6、兼顾速度与精准

如果你的代码库很大,这里有个小技巧:先用 ripgrep 筛选文件,然后交给 ast-grep 处理。

示例:

rg -l -t ts 'useQuery\(' | xargs ast-grep run -l TypeScript -p 'useQuery($A)' -r 'useSuspenseQuery($A)' -U

这条命令首先查找所有包含 useQuery( 的文件,然后将其替换为 useSuspenseQuery() ,但仅限于实际代码。

快速 + 精准 = 更轻松。

7、如何安装 ast-grep

如果你还没有安装,安装过程很简单。

brew install ast-grep

或者:

cargo install ast-grep

你也可以请求你的 AI 代码助手(例如 Claude 或 Codex)帮你安装。

8、思维模型

  • ripgrep 关注的是代码行。
  • ast-grep 关注的是语法节点。
  • ripgrep 速度更快。
  • ast-grep 更智能。

如果你要搜索文本,请使用 ripgrep。如果你要修改代码——重构、重写或检查——请使用 ast-grep。

而且大多数情况下,你会同时使用两者。

9、结束语

不妨这样想:

ripgrep 就像快速浏览一本书。ast-grep 就像理解其背后的语法。

两者各有用途。使用 ripgrep 可以快速解决问题,而 ast-grep 则适合那些不能出错的情况。

下次当你发现自己需要手动滚动浏览数百个误报时——也许是时候让你的搜索工具像编译器一样思考了。


原文链接:Supercharge Your Codex or Claude Agents with ast-grep: Smarter, Syntax-Aware Code Search

汇智网翻译整理,转载请标明出处