用途
Structural Search 用于按代码的抽象语法树(AST)结构进行搜索,能够发现正则表达式无法可靠匹配的语义模式。它适合以下场景:查找函数或方法的所有使用位置、定位特定代码模式(如 hooks、API 调用)、为大规模重构做准备、在正则匹配会产生误报时使用、检测反模式与安全问题、创建自定义 lint 规则。
主要能力
工具基于 ast-grep,命令形式为 sg -p 'pattern',用于进行 AST 感知的代码搜索。
模式语法包括三种:
$NAME匹配具名标识符,示例function $NAME() {}$_匹配任意单个节点,示例console.log($_)$$$匹配零个或多个节点,示例function $_($$$) {}
资料中列出十个常用模式示例:
- 查找 console.log 调用:
sg -p 'console.log($_)' - 查找 React hooks:
sg -p 'const [$_, $_] = useState($_)';sg -p 'useEffect($_, [$$$])' - 查找函数定义:
sg -p 'function $NAME($$$) { $$$ }';sg -p 'def $NAME($$$): $$$' --lang python - 查找导入:
sg -p 'import $_ from "$_"';sg -p 'from $_ import $_' --lang python - 查找异步模式:
sg -p 'await $_';sg -p 'async function $NAME($$$) { $$$ }' - 查找错误处理:
sg -p 'try { $$$ } catch ($_) { $$$ }';sg -p 'if err != nil { $$$ }' --lang go - 查找潜在问题:
sg -p '$_ == $_'(使用 == 而非 ===)、sg -p 'eval($_)'(安全风险)、sg -p '$_.innerHTML = $_'(XSS 途径) - 预览重构:
sg -p 'console.log($_)' -r 'logger.info($_)' - 应用重构:
sg -p 'var $NAME = $_' -r 'const $NAME = $_' --rewrite - 指定语言搜索:
sg -p 'pattern' --lang typescript
使用方式
快速参考命令:
- 查找模式:
sg -p 'pattern' - 指定语言:
sg -p 'pattern' --lang python - 替换(预览):
sg -p 'old' -r 'new' - 替换(应用):
sg -p 'old' -r 'new' --rewrite - 显示上下文:
sg -p 'pattern' -A 3 - JSON 输出:
sg -p 'pattern' --json - 仅显示文件列表:
sg -p 'pattern' -l - 统计匹配数量:
sg -p 'pattern' --count - 运行 YAML 规则:
sg scan
附加资源
如需完整模式,可加载以下文件:
./references/js-ts-patterns.md:JavaScript/TypeScript 模式./references/python-patterns.md:Python 模式./references/go-rust-patterns.md:Go 和 Rust 模式./references/security-patterns.md:安全漏洞检测./references/advanced-usage.md:YAML 规则与工具集成./assets/rule-template.yaml:自定义规则的起始模板
适用场景与限制
适用于跨语言的语义代码搜索、重构准备、反模式与安全问题检测、自定义 lint 规则创建。关于安装方式、收费方式、支持语言的完整列表、平台兼容性等事实,资料中暂未提供。