Ripgrep快速文本搜索工具Skill ripgrep

Ripgrep 是一个高速的文本搜索工具,用于在文件中搜索正则表达式模式。它默认尊重 .gitignore,速度比 grep 快 10-100 倍,适用于代码库搜索、大文件处理、内容提取、开发调试等场景。关键词:文本搜索、正则表达式、文件搜索、代码开发工具、快速搜索、命令行工具。

DevOps 0 次安装 0 次浏览 更新于 3/9/2026

name: ripgrep description: 当在文件、代码库、书籍或文档中搜索文本时使用。当按模式查找文件、搜索太大而无法完全读取的大文件、从多个文件中提取特定内容,或者当grep/find太慢时使用。触发词包括“搜索”、“查找出现”、“寻找模式”、“在文件中搜索”。

Ripgrep (rg) - 快速文本搜索工具

概述

Ripgrep 是一个面向行的搜索工具,它递归地搜索目录中的正则表达式模式。它比 grep 快 10-100 倍,并默认尊重 .gitignore。用它代替 grep、find 或手动读取大文件。

核心原则: 当需要在文件中查找文本时,使用 ripgrep。不要将整个文件读入上下文,当你可以搜索它们时。

何时使用

使用 ripgrep 当:

  • 在代码库或目录中搜索文本模式
  • 查找函数、变量或字符串的所有出现
  • 搜索书籍、文档或大文本文件
  • 文件太大,无法完全读入上下文
  • 一次在多个文件中查找特定内容
  • 查找包含(或不包含)某些模式的文件
  • 提取匹配行进行分析

不要使用当:

  • 需要完整的文件内容(使用 Read 工具)
  • 仅用于文件名的简单全局模式匹配(使用 Glob 工具)
  • 需要结构化数据提取(考虑 jq、awk)

快速参考

任务 命令
基本搜索 rg "pattern" [path]
不区分大小写 rg -i "pattern"
智能大小写(自动) rg -S "pattern"
仅全词匹配 rg -w "word"
固定字符串(无正则表达式) rg -F "literal.string"
显示上下文行 rg -C 3 "pattern"(前后3行)
显示行号 rg -n "pattern"(在 tty 中默认)
仅文件名 rg -l "pattern"
无匹配的文件 rg --files-without-match "pattern"
计数匹配 rg -c "pattern"
仅匹配部分 rg -o "pattern"
反转匹配 rg -v "pattern"
多行搜索 `rg -U "pattern.*
more"`

文件过滤

按文件类型

Ripgrep 有内置的文件类型定义。使用 -t 包含,-T 排除:

# 仅搜索 Python 文件
rg -t py "def main"

# 仅搜索 JavaScript 和 TypeScript
rg -t js -t ts "import"

# 排除测试文件
rg -T test "function"

# 列出所有已知类型
rg --type-list

常见类型: pyjstsrustgojavaccpprbphphtmlcssjsonyamlmdtxtsh

按全局模式

# 仅 .tsx 文件
rg -g "*.tsx" "useState"

# 排除 node_modules(除了 gitignore)
rg -g "!node_modules/**" "pattern"

# 仅 src 目录中的文件
rg -g "src/**" "pattern"

# 多个全局模式
rg -g "*.js" -g "*.ts" "pattern"

# 不区分大小写的全局模式
rg --iglob "*.JSON" "pattern"

按文件大小

# 跳过大于 1MB 的文件
rg --max-filesize 1M "pattern"

目录控制

# 限制深度
rg --max-depth 2 "pattern"

# 搜索隐藏文件(点文件)
rg --hidden "pattern"

# 跟随符号链接
rg -L "pattern"

# 忽略所有忽略文件(.gitignore 等)
rg --no-ignore "pattern"

# 渐进无限制(-u 可堆叠最多3次)
rg -u "pattern"      # --no-ignore
rg -uu "pattern"     # --no-ignore --hidden
rg -uuu "pattern"    # --no-ignore --hidden --binary

上下文选项

# 匹配后的行
rg -A 5 "pattern"

# 匹配前的行
rg -B 5 "pattern"

# 匹配前后的行
rg -C 5 "pattern"

# 匹配时打印整个文件(通过模式)
rg --passthru "pattern"

输出格式

# 仅带匹配的文件名
rg -l "pattern"

# 无匹配的文件
rg --files-without-match "pattern"

# 每个文件的匹配计数
rg -c "pattern"

# 总匹配计数(非行数)
rg --count-matches "pattern"

# 仅匹配文本(非整行)
rg -o "pattern"

# JSON 输出(用于解析)
rg --json "pattern"

# Vim 兼容输出(文件:行:列:匹配)
rg --vimgrep "pattern"

# 带统计信息
rg --stats "pattern"

正则表达式模式

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 "old" -r "new"

# 使用捕获组
rg "(\w+)@(\w+)" -r "$2::$1"

# 移除匹配(空替换)
rg "pattern" -r ""

搜索特殊文件

压缩文件

# 在 gzip、bzip2、xz、lz4、lzma、zstd 文件中搜索
rg -z "pattern" file.gz
rg -z "pattern" archive.tar.gz

二进制文件

# 包含二进制文件
rg --binary "pattern"

# 将二进制视为文本(可能产生垃圾)
rg -a "pattern"

大文件

对于太大而无法读入上下文的文件:

# 搜索并仅显示匹配行
rg "specific pattern" large_file.txt

# 限制每个文件的前 N 个匹配
rg -m 10 "pattern" huge_file.log

# 显示字节偏移以导航大文件
rg -b "pattern" large_file.txt

# 与 head/tail 结合用于分页
rg "pattern" large_file.txt | head -100

性能提示

  1. 具体指定路径 - 当知道子目录时,不要从根目录搜索
  2. 使用文件类型 - -t py-g "*.py" 更快
  3. 使用固定字符串 - 当不需要正则表达式时使用 -F
  4. 限制深度 - 当知道结构时使用 --max-depth
  5. 让 gitignore 工作 - 除非需要,否则不要使用 --no-ignore
  6. 使用词边界 - -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 "keyword" book.txt

与其他工具结合

# 查找文件,然后搜索
rg --files | xargs rg "pattern"

# 搜索并按文件计数
rg -c "pattern" | sort -t: -k2 -rn

# 搜索并在编辑器中打开
rg -l "pattern" | xargs code

# 提取唯一匹配
rg -o "\b[A-Z]{2,}\b" | sort -u

# 从文件搜索多个模式
rg -f patterns.txt

退出码

含义
0 找到匹配
1 未找到匹配
2 发生错误

用于脚本:

if rg -q "pattern" 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(实际修改文件)
仅按名称查找文件 fdfind
简单文件列表 lsglob
需要完整文件内容 Read 工具