amber:932⭐的代码搜索替换工具,比 grep/sed 更直观
在命令行中进行代码搜索和替换是开发者的日常操作,但 grep 的输出难以阅读,sed 的语法令人费解。amber 是一个用 Rust 编写的代码搜索/替换工具,它保留了 grep 的强大功能,同时提供了更友好的交互体验和更清晰的输出格式。
项目概览
| 属性 | 内容 |
|---|---|
| GitHub | dalance/amber |
| Stars | 932 |
| 语言 | 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 | 内置 | 通用文本搜索 | 中等 |
| ripgrep | 47k+ | 极速代码搜索 | 低 |
| sed | 内置 | 流编辑器 | 高 |
| amber | 932 | 搜索+替换一体化 | 低 |
与 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 |