在命令行中进行代码搜索和替换是开发者的日常操作,但 grep 的输出难以阅读,sed 的语法令人费解。amber 是一个用 Rust 编写的代码搜索/替换工具,它保留了 grep 的强大功能,同时提供了更友好的交互体验和更清晰的输出格式。

项目概览

属性内容
GitHubdalance/amber
Stars932
语言Rust
特点彩色输出、交互式确认、批量替换
最后更新1天前

解决的问题

传统的代码替换流程通常是这样的:

# 先搜索
grep -r "oldFunction" .

# 再替换,但 sed 语法总让人不放心
sed -i 's/oldFunction/newFunction/g' $(grep -rl "oldFunction" .)

这个流程有几个问题:

  • 看不到完整的上下文,容易误替换
  • 没有预览机制,一旦出错难以恢复
  • 跨平台时 sed -i 的行为不一致(BSD sed 和 GNU sed 参数不同)

核心特性

1. 彩色上下文输出

amber 在显示匹配结果时会展示完整的代码上下文,并用颜色高亮匹配部分,让你在执行替换前能清楚地看到每一行会发生什么变化。

$ ambr oldFunction newFunction

./src/main.rs
  15 | fn oldFunction() -> i32 {
  16 |     oldFunction() + 1
     |     ^^^^^^^^^^^ replace with 'newFunction'

2. 交互式确认

默认情况下,amber 会逐个询问是否替换,避免批量误操作。你可以按 y 确认、n 跳过,或按 a 全部替换。

3. 正则表达式支持

支持完整的正则表达式匹配和捕获组替换:

# 将 console.log 转换为 logger.debug
ambr "console\.log\((.*)\)" "logger.debug(\1)"

4. 文件过滤

可以按文件类型过滤,避免搜索无关文件:

# 只在 .rs 文件中搜索
ambr "unwrap()" "expect(\"fatal error\")" --include "*.rs"

# 排除测试文件
ambr "TODO" "FIXME" --exclude "*test*"

快速开始

安装

# 通过 cargo
cargo install amber

# 或通过 Homebrew (macOS/Linux)
brew install amber

基本用法

# 搜索(类似于 grep,但输出更友好)
amber "pattern"

# 搜索并替换(交互式确认)
ambr "old" "new"

# 强制替换所有(无需确认)
ambr "old" "new" --yes

# 仅预览,不实际替换
dry-run "old" "new"

工具对比

工具Stars定位学习曲线
grep内置通用文本搜索中等
ripgrep47k+极速代码搜索
sed内置流编辑器
amber932搜索+替换一体化

与 ripgrep 相比,amber 专注于替换场景而非单纯搜索;与 sed 相比,amber 的输出更直观,交互更安全。

适用场景

  • 重构代码: 安全地批量重命名函数、变量
  • 更新 API: 替换废弃的调用方式
  • 清理代码: 统一代码风格,如替换所有的 console.log 为正规的日志调用
  • 迁移项目: 大规模替换文件路径或配置项

注意事项

  • 默认会跳过 .git 目录和二进制文件
  • 建议在执行大规模替换前先使用 --dry-run 预览
  • 正则表达式语法与 Rust regex 一致(Perl 兼容风格)

总结

amber 不是一个革命性的工具,但它解决了 grep + sed 组合中那些让人不爽的小问题。当你需要在项目中进行批量替换时,它提供的上下文预览和交互确认能有效降低出错风险。

对于 932 stars 的小众项目来说,amber 的代码质量和维护活跃度都相当不错,值得尝试。


属性内容
仓库https://github.com/dalance/amber
许可证MIT
语言Rust
维护者@dalance