lang: zh slug: code-search-replace-tools-grep-modern-alternatives title: ‘代码搜索和替换工具:从 grep 到 ripgrep、sd’ description: ‘探索现代代码搜索工具,从 grep 到 ripgrep、fzf、sd 和 Sourcegraph。 2025 年开发者搜索的基准、工作流程和设置指南。’ tags: [“alternatives”, “comparison”, “dev-tools”, “engine”, “open-source”, “review”, “search”] date: 2026-05-18 00:00:00+08:00 lastmod: 2026-05-18 00:00:00+08:00 tech_stack: [] application_domain: Dev Utils source_version: ’' licensing_model: Open Source license_type: MIT file_size: ’' file_md5: ’' download_url: ’' backup_url: ’' github_repo: ’' last_maintained: ‘2026-05-18’ draft: false aliases:- /posts/code-search-replace-tools-grep-modern-alternatives/ 常见问题解答:

  • q: ‘ripgrep 比 grep 更快吗?’ a: ‘是的,对于代码搜索,ripgrep 通常比 grep 快 5-10 倍。 在热缓存上,它在大约 0.8 秒内搜索整个 Linux 内核源代码(25+ 百万行),而 grep 需要 8 秒以上。 速度来自并行目录遍历、自动 .gitignore 过滤、内存映射 I/O 和 SIMD 加速模式匹配。
  • q: ‘跨多个文件搜索代码的最佳命令行工具是什么?’ a: ‘ripgrep (rg) 是最好的通用代码搜索工具。 它默认情况下递归搜索,自动尊重 .gitignore,按文件类型过滤,并正确处理 Unicode。 对于交互式文件导航,请使用 rg --files | 将其与 fzf 结合起来。 fzf --preview ''bat {}''。’
  • q: ‘如何从命令行查找和替换多个文件中的文本?’ a: ‘使用 sd 以获得人性化的语法:首先使用 ripgrep (rg -l ''old_pattern'') 查找受影响的文件,然后运行 ​​sd ''old'' ''new'' $(rg -l ''old'')。 使用“–preview”标志在应用更改之前检查更改。 对于可移植的 shell 脚本,sed 仍然是正确的选择。
  • q: ‘ack、ag 和 ripgrep 之间有什么区别? a:‘ack(2005 年,用 Perl 编写)是第一个以开发人员为中心的 grep 替代品,引入了 .gitignore 尊重、文件类型过滤和彩色输出。 ag(The Silver Searcher,2011)用 C 语言重写了这些功能,速度提高了 3-5 倍。 ripgrep(rg,2016)凭借卓越的性能、更好的 Unicode 支持和积极的开发超越了两者,使其成为新设置的明确选择。
  • q: ‘VS Code 使用 ripgrep 进行搜索吗?’ a: ‘是的,VS Code 在内部使用 ripgrep 来实现其内置搜索功能,因此当您在编辑器中搜索时,您已经在使用它了。 要从集成终端运行 ripgrep,请将其安装在您的系统上(例如 macOS 上的“brew install ripgrep”或 Ubuntu 上的“apt install ripgrep”)并直接运行“rg”命令。 特征图片:/images/articles/code-search-and-replace-tools-from-grep-ripgrep.png——{</* 资源信息 */>}搜索代码是开发人员最常执行的任务之一。 查找函数的定义位置、跟踪变量的使用方式或在数十个文件中替换已弃用的 API - 这些操作每天会发生数十次。 正确的搜索工具可以将几分钟的滚动时间变成几秒钟的打字时间。代码搜索领域已经发生了巨大的变化。 grep 是已有 50 年历史的 Unix 主打工具,它已经让位于更快、更智能、对开发人员更友好的新一代工具。 本指南追踪了这一演变,对竞争者进行了基准测试,并向您展示如何构建一个搜索工具包,使浏览代码库变得毫不费力。
    代码搜索和替换工具:从 grep 到 ripgrep、sd 和现代替代工具 — dibi8.com
    ## 为什么 grep 已经不足以满足现代开发的需要grep(全局正则表达式打印)由 Ken Thompson 于 1974 年创建。 它在文件内容中搜索与正则表达式匹配的模式并打印匹配的行。 几十年来,它是唯一可用的工具。 它仍然预装在每个类 Unix 系统上,并在 shell 脚本中可靠地工作。但 grep 是为不同时代设计的。 它不理解“.gitignore”文件,因此会浪费时间搜索“node_modules”、“.git”和构建工件。 默认情况下,它不按文件类型过滤。 递归搜索需要“-r”标志,并且仍然遍历不相关的目录。 二进制文件处理很粗糙。 输出格式缺乏加速理解的视觉提示。对于几个文件中的简单搜索,grep 仍然有效。 对于现代代码库中的日常开发,有更好的选择。## ack:以开发人员为中心的 grep 替代品ack(“比 grep 更好,为程序员设计”)由 Andy Lester 于 2005 年创建。它引入了三个成为现代搜索工具标准的概念:自动尊重“.gitignore”、无需正则表达式的文件类型检测以及彩色格式化输出。使用 ack,您可以输入 ack --python "class User" 而不是 grep -r --include="*.py" "class User"--python 标志知道哪些文件扩展名属于 Python。 彩色输出以不同的颜色突出显示匹配项、行号和文件名。 这些默认设置可以节省打字时间并减少认知负担。ack 是用 Perl 编写的,并通过 CPAN 或包管理器安装。 它在 2025 年仍保持功能,但更新很少。 ack 的主要历史重要性是证明以开发人员为中心的搜索工具可以在 grep 的默认设置上得到显着改进。 请参阅 beyondgrep.com 了解文档。## Silver Searcher (ag):速度作为特征The Silver Searcher, commonly called “ag,” was released by Geoff Greer in 2011. It implemented the same developer-friendly features as ack but rewrote the core in C for maximum performance. 发布时的基准测试显示,对于典型的代码搜索任务,ag 比 ack 快 3-5 倍。ag respects .gitignore, .hgignore, and .ignore files automatically. It searches only source code files by default, skipping binary files, hidden directories, and generated artifacts. The command-line interface mirrors ack’s conventions: ag "function_name" --js searches JavaScript files.Editor integration is a strength. ag ships with built-in support for Vim (through plugins like ack.vim), Emacs, and Sublime Text. VS Code’s search uses ripgrep internally, but ag plugins remain available for Vim users who prefer its specific behavior.In 2025, ag’s maintenance has slowed. The last significant release was in 2020. While still functional, it has been surpassed by ripgrep in both speed and feature set. New setups should use ripgrep instead, but ag remains installed on many long-established development machines. The ag GitHub repository archives the project’s history.## ripgrep (rg):代码搜索的新标准ripgrep 由 Andrew Gallant 于 2016 年创建,是 2025 年占主导地位的代码搜索工具。它将 ack 和 ag 的最佳功能与卓越的性能、更智能的默认值和更广泛的平台支持结合在一起。 ripgrep 是用 Rust 编写的,利用内存映射、并行目录遍历和 SIMD 加速模式匹配来实现甚至超过 ag 的速度。在热文件系统缓存上,ripgrep 在大约 0.8 秒内搜索 Linux 内核源代码树(60,000 个文件中超过 2500 万行)。 grep 执行相同的搜索需要 8 秒以上。 ag需要2-3秒。 随着更大的代码库和更复杂的模式,性能差距扩大。智能默认设置消除了典型用途的配置。 ripgrep 自动尊重 .gitignore.ignore.rgignore 文件。 它会跳过隐藏文件和二进制文件。 它自动检测文件编码(UTF-8、UTF-16、Latin-1)。 结果是 rg "pattern" 在 95% 的情况下都能做正确的事情——不需要任何标志。ripgrep 正确支持 Unicode,包括搜索混合编码文件和匹配 Unicode 感知的正则表达式模式。 这对于具有国际化字符串、注释中的表情符号或非 ASCII 标识符的代码库很重要。类型过滤按语言缩小搜索范围,无需手动全局模式:bas h rg "User" --type js # 仅 JavaScript 文件 rg "User" --type-add 'config:*.conf' --type config # 自定义类型 rg "User" -tjs -trs # 多种类型:JS 和 Rust rg "User" --type-not json # 排除 JSON 文件通过“.ripgreprc”的配置文件支持允许您设置项目范围的默认值。 常见设置包括:```` bas h
~/.ripgreprc #

–智能案例 –关注 –隐藏 –glob=!*.min.js –glob=!node_modules –glob=!.git ````编辑器集成非常全面。 VS Code 使用 ripgrep 来实现搜索功能。 Vim 用户将 ripgrep 与 fzf ``bash 结合起来

~/.ripgreprc #

–智能案例 –关注 –隐藏 –glob=!*.min.js –glob=!node_modules –glob=!.git ls 使用 ripgrep。 [ripgrep GitHub 存储库](https://github.com/BurntSushi/ripgrep) 提供所有平台的安装说明和大量文档。## fzf:交互式模糊查找fzf并不是传统意义上的搜索工具。 它是一个交互式模糊查找器,可在您键入时实时过滤列表。 与 ripgrep 相结合,fzf 将命令行搜索转变为可与 IDE 搜索功能相媲美的交互式体验。核心概念很简单:将任何列表通过管道传输到 fzf,输入要过滤的字符,然后按 Enter 键进行选择。 fzf 模糊匹配 - 输入“usctrl”匹配“user_controller.rb”,因为这些字符按顺序出现。 这种“模糊”匹配比键入精确的子字符串更快。默认按键绑定改变了日常工作流程。 `Ctrl+T` 将模糊选择的文件路径粘贴到光标处。 `Alt+C` 将目录更改为模糊选择的子目录。 `Ctrl+R` 将 shell 的历史搜索替换为交互式、模糊过滤的先前命令列表。预览窗口会在您导航时显示文件内容。 结合bat进行语法高亮,预览使文件选择可视化:```` bas h rg --文件 | fzf --preview 'bat --style=numbers --color=always {}' --bind 'enter:execute(vim {})' ````这个命令列出了所有项目文件,预览每个文件的行号和语法突出显示,并在 Vim 中打开选定的文件。 这是从终端导航不熟悉的代码库的最快方法。git inte``` bas h rg --文件 | fzf --preview 'bat --style=numbers --color=always {}' --bind 'enter:execute(vim {})' d 储藏管理。 fzf GitHub 存储库 包含这些工作流程的示例脚本。## sd:直观的查找和替换搜索是问题的一半。 另一半是跨文件替换文本。 自 1974 年以来,sed(流编辑器)一直是标准的 Unix 工具,但它的语法非常困难。 记住是否使用“-i”进行就地编辑、转义路径中的正斜杠以及跨 sed 变体以不同的方式处理捕获组会消耗更多的精力,最好将精力花在实际问题上。sd 取代 sed 来执行面向人类的查找和替换任务。 它的语法很简单:“sd ‘old_pattern’ ‘replacement’ file”。 sd 默认使用正则表达式,但提供了一个“–string-mode”标志用于文字替换。 在字符串模式下,没有字符需要转义 - sd 'foo.bar' 'baz' file 替换文字字符串 foo.bar,而不是正则表达式模式。递归目录替换会替换项目树中出现的所有内容:```` bas h sd ‘已弃用的函数’ ‘新函数’ $(rg -l ‘已弃用的函数’)

ripgrep(查找包含该模式的文件)与 sd(执行替换)结合起来。 “--preview”标志在应用更改之前显示更改,从而防止生产代码中出现代价高昂的错误。与常见任务的替代方案的比较 - 在​​所有 JavaScript 文件中将“http”替换为“https”:````
bas
h
# sed:复杂的转义,易于获取```
bas
h
sd '已弃用的函数' '新函数' $(rg -l '已弃用的函数')
```
er
l
-pi -e 's/http/https/g' $(find .-name "*.js")# sd:简单,没有转义问题
sd 'http' 'https' $(rg -l 'http' --type js)
````对于可移植性很重要的
shell 脚本,sed 仍然是正确的选择。 对于交互式开发工作,sd 是优越的工具。 [sd GitHub 存储库](https://github.com/chmln/sd) 有安装说明和附加考试```
bas
h
# sed:转义复杂,容易出错
sed -i 's/http/https/g' $(find .-name "*.js")

# perl:可以工作,但很神秘
perl -pi -e 's/http/https/g' $(find .-name "*.js")

# sd:简单,没有转义问题
sd 'http' 'https' $(rg -l 'http' --type js)
``e 跨文件。 搜索面板通过语法突出显示来预览结果。 多光标编辑使您可以在多个文件中同时进行相关更改。 对于项目范围的重构,VS Code 的搜索和替换通常比 CLI 工作流程更快。**JetBrains IDEs** (IntelliJ, PyCharm, WebStorm) provide structural search and replace — searching not by text patterns but by AST structures. Find all `for` loops that iterate over a specific collection type, regardless of variable names. This semantic search is impossible with regex-based tools and invaluable for large-scale refactoring.**Vim/Neovim** 提供 `:vimgrep` 用于项目搜索,`:cfdo` 用于跨 Quickfix 列表文件运行命令,以及 Telescope(在 Neovim 中)用于与 fzf 相当的模糊查找界面。 `:Rg` 与 ripgrep 的集成提供了类似 IDE 的搜索,无需离开编辑器。CLI 工具因速度、可组合性和在脚本中的使用而获胜。 编辑器搜索在交互式重构、预览以及与编辑工作流程的集成方面获胜。 两者都用。## 大规模代码搜索平台当您的代码库超过单个存储库时,或者当您需要搜索整个组织的代码时,专用平台会提供基础设施。**Sourcegraph** 是一个代码智能平台,可对存储库进行索引,以便在数百万个文件中进行基于正则表达式的快速搜索。 它添加了代码导航(单击定义、查找引用)、批量更改(跨多个存储库的自动代码修改)和代码洞察(随着时间的推移跟踪代码模式)。 Amazon、PayPal 和 Uber 等公司使用 Sourcegraph 来管理大规模代码。 请参阅 [sourcegraph.com](https://sourcegraph.com) 了解定价和部署选项。**GitHub 代码搜索** 提供具有正则表达式支持、路径过滤和语言范围界定的本机存储库搜索。 2023 年重写显着提高了性能和准确性。 对于 GitHub 上的组织来说,这是跨所有存储库进行搜索的最简单方法。**OpenGrok** 和 **Hound** 是自托管代码搜索引擎。 OpenGrok 是更成熟的选项,支持 20 多种编程语言、交叉引用导航和历史搜索。 Hound 设置起来更简单,但功能不太丰富。 两者都需要索引基础设施并在代码更改时定期重新索引。**Livegrep** 为 Google 的内部代码搜索提供支持,并作为开源提供。 它使用自定义三元组索引在大量代码库中进行快速正则表达式搜索。 设置很复杂,但对于拥有数十亿行代码的组织来说,性能是无与伦比的。## 日常开发的完整搜索工作流程最好的开发人员将工具组合到特定任务的工作流程中:**每日代码导航:** `rg --files | fzf --preview 'bat {}'` — 模糊查找具有语法突出显示预览的文件。 这是您探索代码库的默认设置。**查找定义:** `rg "^fn main" --type rust` — 正则表达式锚定搜索函数定义。 对于语言感知搜索,请使用 IDE 的“转到定义”功能。**批量重构:** `rg -l 'old_api' | xargs sd 'old_api' 'new_api'` — 查找包含旧 API 的所有文件,并替换所有文件。 在运行替换之前,始终先预览:`rg 'old_api'`。**跨存储库搜索:** Sourcegraph 或 GitHub 代码搜索用于组织范围内的查询。 设置保存的搜索以跟踪已弃用的 API 使用情况或安全模式。**Git 历史搜索:** `git log -S "function_name"` 查找添加或删除特定字符串的提交。 `git log -G "regex_pattern"` 使用正则表达式匹配。 `git grep "pattern" HEAD~10` 在特定提交处搜索代码库。**日志分析:** `rg "ERROR" -C 5 --after-context 10 /var/log/app` 在每次匹配之前搜索 5 行上下文,之后搜索 10 行上下文。 通过管道传输到“less”以进行分页阅读。## 性能基准:多快才算快?Andrew Gallant 的官方 ripgrep 基准测试在多个测试用例中比较了 grep、ack、ag、git grep 和 ripgrep。 热缓存搜索 Linux 内核源代码的结果:| Tool | Time (seconds) | Notes |
|------|---------------|-------|
| **ripgrep (rg)** | 0.8 | Fastest, smart defaults |
| **The Silver Searcher (ag)** | 2.3 | Good, but surpassed by rg |
| **git grep** | 1.5 | Fast within git repos, limited features |
| **ack** | 4.1 | Slower, but established developer features |
| **grep -r** | 8.2 | Baseline, no optimizations |冷缓存性能(重新启动后首次运行)显示出不同的模式。 ripgrep 的内存映射 I/O 和并行遍历仍然领先,但差距缩小,因为所有工具都受到磁盘读取速度的限制。 内存使用是另一个区别:ripgrep 使用大约 10 MB 进行典型搜索,而 ag 使用 15-20 MB,ack 由于其 Perl 运行时使用 50+ MB。Unicode 处理揭示了 ripgrep 的优势。 在混合 UTF-8 和 UTF-16 文件中搜索模式时,ripgrep 会自动处理编码检测。 grep 和 ag 默认将非 UTF-8 内容视为二进制内容,可能会丢失匹配项。## 结论:构建您的基本搜索工具包现代开发人员的搜索工具包具有三个基本组件。 ripgrep 快速且智能地处理内容搜索。 fzf 为任何列表过滤操作添加了交互性。 sd 取代 sed 来执行查找和替换任务。 这三个工具一起满足了 90% 的日常代码搜索需求。For specialized scenarios, add Sourcegraph for cross-repository search, your IDE's structural search for semantic refactoring, and git's built-in tools for history exploration. Replace ack and ag with ripgrep in new setups — they are legacy tools at this point.The future of code search is AI-assisted. Tools like GitHub Copilot Chat and Sourcegraph Cody already answer natural language questions about code: "Where is user authentication handled?" "Show me all uses of the payment API." These tools do not replace ripgrep and fzf for precise, fast searches. They complement them by handling vague, exploratory queries that would require multiple searches with traditional tools.投资您的搜索工具包。 每次搜索节省的秒数在一个月内节省了数小时。 更重要的是,低摩擦搜索鼓励探索——阅读更多代码,了解更多系统,并做出更好的架构决策。---## 常问问题**ripgrep 比 grep 更快吗?**是的,显着。 对于代码搜索任务,ripgrep 通常比 grep 快 5-10 倍。 速度来自并行目录遍历、自动过滤(尊重 .gitignore)、内存映射文件 I/O 和 SIMD 加速模式匹配。 在热缓存上,ripgrep 在不到一秒的时间内搜索整个 Linux 内核源代码(25+ 百万行)。 grep 执行相同操作需要 8 秒以上。 在磁盘 I/O 成为瓶颈的冷缓存上,差距较小。**跨多个文件搜索代码的最佳工具是什么?**ripgrep 是最好的通用代码搜索工具。 它默认递归搜索,自动尊重 .gitignore,按文件类型过滤,并正确处理 Unicode。 对于交互式文件导航,请将 ripgrep 与 fzf 结合使用:`rg --files | fzf --预览'bat {}'`。 要跨多个存储库或整个组织进行搜索,请使用 Sourcegraph 或 GitHub 代码搜索。 对于语义搜索(通过代码结构而不是文本进行查找),请使用 IDE 的结构搜索功能。**如何从命令行替换多个文件中的文本?**使用 sd(用于简单、人性化的语法)或 sed(用于脚本可移植性)。 推荐的工作流程:首先使用 ripgrep (`rg -l 'old_pattern'`) 查找受影响的文件,然后预览替换文件 (`sd --preview 'old' 'new' file`),然后执行 (`sd 'old' 'new' $(rg -l 'old')`)。 对于使用 sed 进行就地编辑: `sed -i 's/old/new/g' file` (GNU sed) 或 `sed -i '' 's/old/new/g' file` (BSD/macOS sed)。 在批量替换之前始终对代码进行版本控制。**我可以将 ripgrep 与 VS Code 一起使用吗?**VS Code 在内部使用 ripgrep 来实现其搜索功能 - 当您在编辑器中搜索时,您已经在使用它了。 要从集成终端使用 ripgrep,请将其安装在您的系统上(macOS 上为“brew install ripgrep”,Ubuntu 上为“apt install ripgrep”)并直接运行“rg”命令。 为了增强终端搜索,请安装 VS Code 的 fzf 扩展,以在编辑器界面中进行模糊文件查找。**ack、ag 和 rg 之间有什么区别?**ack 是第一个以开发人员为中心的 grep 替代品(2005 年),用 Perl 编写。 它引入了 .gitignore、文件类型过滤和彩色输出。 ag(The Silver Searcher,2011)用 C 语言重写了 ack 的功能集,速度提高了 3-5 倍。 rg(ripgrep,2016)凭借卓越的性能、更好的 Unicode 支持、更广泛的平台可用性和持续的积极开发超越了两者。 到 2025 年,ripgrep 是新设置的明确选择。 ack 和 ag 是遗留工具——功能正常,但未维护或维护程度最低。 这三者都共享相似的命令行界面,因此从一种过渡到另一种只需最少的重新学习。---## 推荐的基础设施要 24/7 可靠地运行上述任何工具,基础设施很重要:- **{< aff "digitalocean" "footer-cta-legacy" "DigitalOcean" >}}** — 200 美元免费赠金、超过 14 个全球区域、用于 AI/开发工作负载的一键式 Droplet。 
- **{< aff "htstack" "footer-cta-legacy" "HTStack" >}}** — 香港 VPS,低延迟,可访问中国大陆。 这与托管 dibi8.com 的 IDC 相同 — 经过生产验证。*附属链接 - 无需额外费用,有助于保持 dibi8.com 的运行。*
featureImage: /images/articles/代码搜索和替换工具从-grep-到-ripgrepsd.jpg

💬 留言讨论