如何安装 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。

安装brew · apt · dnf
搜索字面量 · 正则
对照rg vs grep
安装 rg正则与 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 安装

  1. 1
    macOS(Homebrew)

    brew install ripgrep。验证:which rg 与 rg --version。

  2. 2
    Debian / Ubuntu

    sudo apt update && sudo apt install ripgrep。包名多为 ripgrep,二进制为 rg。

  3. 3
    Fedora / Arch

    Fedora:sudo dnf install ripgrep。Arch:sudo pacman -S ripgrep。

  4. 4
    Windows(可选)

    winget install BurntSushi.ripgrep.MSVC 或 GitHub Releases 的 MSI/zip。本稿示例以 macOS/Linux 为主。

  5. 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 PATTERNgrep -rIn PATTERN .
尊重 .gitignore默认开启无;需手动排除或配合其他工具
固定字符串rg -F 'a.b'grep -F 'a.b'
忽略大小写rg -igrep -i
只列文件名rg -lgrep -rl
上下文rg -C 3grep -C 3
按扩展名过滤rg -t js 或 -g '*.js'grep -r --include='*.js'
速度 / 并行默认多线程、针对代码库优化单线程为主;大树上较慢
POSIX / 最小镜像需额外安装系统自带,脚本可移植性高
读单文件 stdinrg pattern filegrep 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 展开。用单引号包住正则最省事;含单引号本身时用双引号并转义。

搜完代码要对齐设计

理清模块边界后,服务关系仍适合摊在同一张白板上。见 如何创建空间。

即刻开会