如何安装 ripgrep (rg):基础正则搜索、常用 flags 与 grep 对照
安装 rg,跑第一条正则搜索,常用 flags 速查,并知道何时仍用 grep。
在仓库里找字符串时,grep -r 能工作,但容易扫进 node_modules、要记得写路径,正则转义也常被 shell 吃掉。ripgrep(命令 rg,BurntSushi / Rust)默认递归、尊重 .gitignore,并把常见搜索场景做成短 flags。本教程专注 安装 rg、字面量与基础正则、常用 flags,以及与 grep 的对照,面向 hereink 读者与 fd、bat 并用的终端栈;忽略规则细节见站内 ripgrep 与 .gitignore 一文。
检索词是如何安装 ripgrep 做正则搜索并对比 grep 常用参数。读完应能安装 rg、在项目根跑第一条搜索、用 -n/-l/-i/-w 等 flags,并知道何时仍用系统自带的 grep。
ripgrep 解决什么问题
少写 flags 的仓库搜索
rg TODO 从当前目录递归,跳过被 ignore 的路径,输出带文件名与行号(默认行为见下)。比 grep -rIn TODO . 少踩「扫完全库」的坑。
与 fd、bat 分工
fd 按路径圈文件、rg 搜内容、bat 高亮阅读命中文件。组合:rg -l pattern | xargs bat。
上游:
github.com/BurntSushi/ripgrep。安装后运行rg --version确认。
在 macOS 与 Linux 安装
- 1macOS(Homebrew)
brew install ripgrep。验证:which rg与rg --version。 - 2Debian / Ubuntu
sudo apt update && sudo apt install ripgrep。包名多为ripgrep,二进制为rg。 - 3Fedora / Arch
Fedora:
sudo dnf install ripgrep。Arch:sudo pacman -S ripgrep。 - 4Windows(可选)
winget install BurntSushi.ripgrep.MSVC或 GitHub Releases 的 MSI/zip。本稿示例以 macOS/Linux 为主。 - 5第一条搜索
在 Git 仓库根:
rg "fn main"或rg TODO。无匹配时 rg 退出码为 1(脚本里需区分「无命中」与「出错」)。
字面量与基础正则
默认情况下,rg PATTERN 把 PATTERN 当正则表达式(Rust regex 语法)。要搜含有点、括号等特殊字符的字面量,用引号并转义,或加 -F / --fixed-strings 固定字符串模式。
# 字面量(固定字符串,不解释正则元字符)
rg -F 'config.json' .
rg -F 'foo.bar' src/
# 基础正则:行首、单词、分组
rg '^import ' --type py
rg '\bError\b' logs/
rg 'function\s+(\w+)' -n app.js
# shell 里用单引号包住 pattern,避免 $ 和 ! 被 bash 展开
rg 'TODO|FIXME' .
# 只搜某个路径(可多次出现)
rg pattern src/ tests/
rg pattern Cargo.toml常用 flags 速查
# 行号(默认常开;关掉用 --no-line-number)
rg -n pattern
# 只列文件名(适合管道给 bat、xargs)
rg -l pattern
# 忽略大小写
rg -i pattern
# 整词匹配
rg -w Token
# 上下文行(前后各 N 行)
rg -C 3 panic
# 按扩展名 / 类型(内置类型见 rg --type-list)
rg -t js pattern
rg -t rust 'unwrap\('
# glob 过滤路径(只要 src 下的 ts)
rg pattern -g '*.ts' -g '!*.min.ts'
# 统计每个文件命中次数
rg -c pattern
# 固定字符串 + 忽略大小写
rg -F -i 'License MIT'
# 限制搜索深度(目录层级)
rg --max-depth 2 pattern需要搜被 .gitignore 忽略的路径时用 --no-ignore 或 -u(输出会暴增);日常开发保持默认。详见站内 gitignore 专题文。
rg 与 grep 对照
| 目标 | ripgrep (rg) | grep |
|---|---|---|
| 递归搜当前树 | rg PATTERN | grep -rIn PATTERN . |
| 尊重 .gitignore | 默认开启 | 无;需手动排除或配合其他工具 |
| 固定字符串 | rg -F 'a.b' | grep -F 'a.b' |
| 忽略大小写 | rg -i | grep -i |
| 只列文件名 | rg -l | grep -rl |
| 上下文 | rg -C 3 | grep -C 3 |
| 按扩展名过滤 | rg -t js 或 -g '*.js' | grep -r --include='*.js' |
| 速度 / 并行 | 默认多线程、针对代码库优化 | 单线程为主;大树上较慢 |
| POSIX / 最小镜像 | 需额外安装 | 系统自带,脚本可移植性高 |
| 读单文件 stdin | rg pattern file | grep pattern file 同样自然 |
可选:在交互 shell 里 alias grep='grep --color=auto' 保留;日常在仓库里用 rg,在只读 /var/log 单文件或必须 POSIX 的 init 脚本里仍用 /bin/grep。
- 适合
- 每天在 Git 仓库搜符号、日志片段、配置键;与 fd/bat 组合;需要默认跳过依赖目录的人。
- 不适合
- 不能安装二进制的极简容器、只搜一个已知路径且不关心 ignore 的单文件——
grep足够;要用 GNU 特有正则扩展时先对照文档。
和站内「ripgrep 与 .gitignore」一文重复吗?
那篇深入 ignore、--no-ignore 与 monorepo 边界;本篇侧重安装、正则入门、常用 flags 与 grep 对照。两篇互补。
rg 能替代 grep 做替换吗?
不能。rg 只负责搜索;批量替换用编辑器、sd、或谨慎的 sed。先 rg -l 圈文件再改更安全。
为什么 pattern 在 shell 里要加引号?
未加引号时 *、?、$() 会被 shell 展开。用单引号包住正则最省事;含单引号本身时用双引号并转义。
搜完代码要对齐设计
理清模块边界后,服务关系仍适合摊在同一张白板上。见 如何创建空间。