名称:ripgrep 描述:当需要在文件、代码库、书籍或文档中搜索文本时使用。当通过模式查找文件、搜索过大而无法完全读取的文件、从多个文件中提取特定内容,或者当grep/find太慢时使用。触发词包括“搜索”、“查找出现”、“查找模式”、“在文件中搜索”。
Ripgrep (rg) - 快速文本搜索工具
概述
Ripgrep是一个面向行的搜索工具,递归地在目录中搜索正则表达式模式。它比grep快10-100倍,默认尊重.gitignore。用它替代grep、find或手动读取大型文件。
**核心原则:**当需要在文件中查找文本时,使用ripgrep。不要将整个文件读入上下文,而是搜索它们。
何时使用
使用ripgrep当:
- 在代码库或目录中搜索文本模式
- 查找函数、变量或字符串的所有出现
- 搜索书籍、文档或大型文本文件
- 文件太大无法完全读入上下文
- 一次性在许多文件中查找特定内容
- 查找包含(或不包含)特定模式的文件
- 提取匹配行进行分析
不使用当:
- 需要完整文件内容(使用读取工具)
- 仅通过文件名进行简单通配符模式匹配(使用Glob工具)
- 需要结构化数据提取(考虑jq、awk)
快速参考
| 任务 | 命令 |
|---|---|
| 基本搜索 | rg "模式" [路径] |
| 大小写不敏感 | rg -i "模式" |
| 智能大小写(自动) | rg -S "模式" |
| 仅全词 | rg -w "词" |
| 固定字符串(无正则表达式) | rg -F "字面字符串" |
| 显示上下文行 | rg -C 3 "模式"(前后各3行) |
| 显示行号 | rg -n "模式"(在tty中默认) |
| 仅文件名 | rg -l "模式" |
| 无匹配的文件 | rg --files-without-match "模式" |
| 计数匹配 | rg -c "模式" |
| 仅匹配部分 | rg -o "模式" |
| 反转匹配 | rg -v "模式" |
| 多行搜索 | `rg -U "模式.* |
| 更多"` |
文件过滤
按文件类型
Ripgrep有内置的文件类型定义。使用-t包含,-T排除:
# 仅搜索Python文件
rg -t py "def main"
# 仅搜索JavaScript和TypeScript
rg -t js -t ts "import"
# 排除测试文件
rg -T test "function"
# 列出所有已知类型
rg --type-list
常见类型: py, js, ts, rust, go, java, c, cpp, rb, php, html, css, json, yaml, md, txt, sh
按通配符模式
# 仅.tsx文件
rg -g "*.tsx" "useState"
# 排除node_modules(除了gitignore)
rg -g "!node_modules/**" "模式"
# 仅src目录中的文件
rg -g "src/**" "模式"
# 多个通配符
rg -g "*.js" -g "*.ts" "模式"
# 大小写不敏感通配符
rg --iglob "*.JSON" "模式"
按文件大小
# 跳过大于1MB的文件
rg --max-filesize 1M "模式"
目录控制
# 限制深度
rg --max-depth 2 "模式"
# 搜索隐藏文件(点文件)
rg --hidden "模式"
# 跟随符号链接
rg -L "模式"
# 忽略所有忽略文件(.gitignore等)
rg --no-ignore "模式"
# 渐进式无限制(-u最多可堆叠3次)
rg -u "模式" # --no-ignore
rg -uu "模式" # --no-ignore --hidden
rg -uuu "模式" # --no-ignore --hidden --binary
上下文选项
# 匹配后的行
rg -A 5 "模式"
# 匹配前的行
rg -B 5 "模式"
# 匹配前后的行
rg -C 5 "模式"
# 匹配时打印整个文件(直通模式)
rg --passthru "模式"
输出格式
# 仅匹配的文件名
rg -l "模式"
# 无匹配的文件
rg --files-without-match "模式"
# 每文件匹配计数
rg -c "模式"
# 总匹配计数(非行)
rg --count-matches "模式"
# 仅匹配文本(非整行)
rg -o "模式"
# JSON输出(用于解析)
rg --json "模式"
# Vim兼容输出(文件:行:列:匹配)
rg --vimgrep "模式"
# 带统计信息
rg --stats "模式"
正则表达式模式
Ripgrep默认使用Rust正则表达式语法:
# 交替
rg "foo|bar"
# 字符类
rg "[0-9]+"
rg "[a-zA-Z_][a-zA-Z0-9_]*"
# 词边界
rg "\bword\b"
# 量词
rg "colou?r" # 0或1
rg "go+gle" # 1或更多
rg "ha*" # 0或更多
rg "x{2,4}" # 2到4次
# 组
rg "(foo|bar)baz"
# 前瞻/后瞻(需要-P用于PCRE2)
rg -P "(?<=prefix)content"
rg -P "content(?=suffix)"
多行匹配
# 启用多行模式
rg -U "start.*
end"
# 点也匹配换行
rg -U --multiline-dotall "start.*end"
# 跨行匹配
rg -U "function\s+\w+\([^)]*\)\s*\{"
替换(仅预览)
Ripgrep可以显示替换效果(不修改文件):
# 简单替换
rg "旧" -r "新"
# 使用捕获组
rg "(\w+)@(\w+)" -r "$2::$1"
# 移除匹配(空替换)
rg "模式" -r ""
搜索特殊文件
压缩文件
# 搜索gzip、bzip2、xz、lz4、lzma、zstd文件
rg -z "模式" file.gz
rg -z "模式" archive.tar.gz
二进制文件
# 包含二进制文件
rg --binary "模式"
# 将二进制作为文本处理(可能产生垃圾)
rg -a "模式"
大型文件
对于太大无法读入上下文的文件:
# 搜索并仅显示匹配行
rg "特定模式" large_file.txt
# 每文件限制前N个匹配
rg -m 10 "模式" huge_file.log
# 显示字节偏移以导航大文件
rg -b "模式" large_file.txt
# 使用head/tail进行分页
rg "模式" large_file.txt | head -100
性能提示
- 指定路径 - 当知道子目录时,不要从根目录搜索
- 使用文件类型 -
-t py比-g "*.py"更快 - 使用固定字符串 - 当不需要正则表达式时使用
-F - 限制深度 - 当知道结构时使用
--max-depth - 让gitignore工作 - 除非需要,否则不要使用
--no-ignore - 使用词边界 -
-w是优化的
常见模式
查找函数定义
# Python
rg "def \w+\(" -t py
# JavaScript/TypeScript
rg "(function|const|let|var)\s+\w+\s*=" -t js -t ts
rg "^\s*(async\s+)?function" -t js
# Go
rg "^func\s+\w+" -t go
查找导入/要求
# Python
rg "^(import|from)\s+" -t py
# JavaScript
rg "^(import|require\()" -t js
# Go
rg "^import\s+" -t go
查找TODO/FIXME注释
rg "(TODO|FIXME|HACK|XXX):"
查找错误处理
# Python
rg "except\s+\w+:" -t py
# JavaScript
rg "\.catch\(|catch\s*\(" -t js
查找类定义
# Python
rg "^class\s+\w+" -t py
# JavaScript/TypeScript
rg "^(export\s+)?(default\s+)?class\s+\w+" -t js -t ts
在书籍/文档中搜索
# 查找章节标题
rg "^(Chapter|CHAPTER)\s+\d+" book.txt
# 查找引用的文本
rg '"[^"]{20,}"' document.txt
# 查找包含词的段落
rg -C 2 "关键词" book.txt
与其他工具结合
# 查找文件,然后搜索
rg --files | xargs rg "模式"
# 搜索并按文件计数
rg -c "模式" | sort -t: -k2 -rn
# 搜索并在编辑器中打开
rg -l "模式" | xargs code
# 提取唯一匹配
rg -o "\b[A-Z]{2,}\b" | sort -u
# 从文件搜索多个模式
rg -f patterns.txt
退出代码
| 代码 | 含义 |
|---|---|
| 0 | 找到匹配 |
| 1 | 未找到匹配 |
| 2 | 发生错误 |
脚本有用:
if rg -q "模式" file.txt; then
echo "找到"
fi
常见错误
| 错误 | 修复 |
|---|---|
| 模式有特殊字符 | 使用 -F 用于固定字符串或转义:rg "foo\.bar" |
| 找不到隐藏文件 | 添加 --hidden 或 -uu |
| 缺少node_modules | 添加 --no-ignore(但通常跳过是正确的) |
| 正则表达式太复杂 | 尝试 -P 用于PCRE2与前瞻/后瞻 |
| 输出太长 | 使用 -m N 限制,或 -l 仅文件名 |
| 二进制文件被跳过 | 添加 --binary 或 -a 用于文本模式 |
| 需要看整行 | 移除 -o(仅匹配)标志 |
何时更偏好其他工具
| 任务 | 更好工具 |
|---|---|
| 结构化JSON查询 | jq |
| 基于列的文本处理 | awk |
| 流编辑/替换 | sed(实际修改文件) |
| 仅按名称查找文件 | fd 或 find |
| 简单文件列表 | ls 或 glob |
| 需要完整文件内容 | 读取工具 |