ripgrep

ripgrep (rg) 是一個快速的文字搜尋工具,結合了 grep 的功能與現代化的使用體驗。

基本搜尋

簡單搜尋

rg pattern                    # 在當前目錄搜尋
rg pattern path/              # 在指定目錄搜尋
rg pattern file.txt           # 在指定檔案搜尋
rg "multi word"               # 搜尋多字串

大小寫控制

rg -i pattern                 # 忽略大小寫 (case-insensitive)
rg -s pattern                 # 大小寫敏感 (case-sensitive)
rg -S pattern                 # 智慧大小寫 (有大寫則敏感)

全字匹配

rg -w word                    # 完整單字匹配
rg '\bword\b'                 # 使用正規表達式的字邊界

模式匹配

正規表達式

rg '^pattern'                 # 行首匹配
rg 'pattern$'                 # 行尾匹配
rg 'pat.*tern'                # 任意字元匹配
rg 'pattern\d+'               # 數字匹配
rg -P 'pattern'               # 使用 PCRE2 引擎

固定字串

rg -F 'literal.string'        # 固定字串搜尋 (不解析正規表達式)
rg -F -f patterns.txt         # 從檔案讀取多個固定字串

多模式搜尋

rg -e pattern1 -e pattern2    # OR 搜尋多個模式
rg 'pattern1|pattern2'        # 使用正規表達式 OR

輸出控制

顯示格式

rg -n pattern                 # 顯示行號 (預設)
rg -N pattern                 # 不顯示行號
rg -H pattern                 # 顯示檔名 (預設)
rg --no-filename pattern      # 不顯示檔名
rg -l pattern                 # 只顯示檔名
rg -c pattern                 # 只顯示每個檔案的匹配數量

上下文顯示

rg -A 3 pattern               # 顯示後 3 行 (After)
rg -B 3 pattern               # 顯示前 3 行 (Before)
rg -C 3 pattern               # 顯示前後各 3 行 (Context)

輸出樣式

rg --color always pattern     # 強制彩色輸出
rg --color never pattern      # 無彩色輸出
rg --pretty pattern           # 美化輸出 (含行號、標題)
rg --vimgrep pattern          # Vim 格式輸出
rg --json pattern             # JSON 格式輸出

僅顯示匹配部分

rg -o pattern                 # 只顯示匹配的文字
rg -r '$1' 'pat(tern)'        # 替換並顯示

檔案過濾

檔案類型

rg -t go pattern              # 只搜尋 Go 檔案
rg -T go pattern              # 排除 Go 檔案
rg --type-list                # 列出所有支援的檔案類型

自訂檔案類型

rg --type-add 'web:*.{html,css,js}' -t web pattern
rg -g '*.go' pattern          # 使用 glob 模式
rg -g '!*.min.js' pattern     # 排除 glob 模式

檔案路徑過濾

rg pattern -g 'src/**'        # 只搜尋 src 目錄下
rg pattern -g '!test/**'      # 排除 test 目錄
rg pattern -g '*.{go,rs}'     # 多個副檔名

隱藏檔案與忽略規則

rg -. pattern                 # 包含隱藏檔案
rg -u pattern                 # 不尊重 .gitignore (一次 u)
rg -uu pattern                # 包含隱藏檔 + 不尊重 .gitignore
rg -uuu pattern               # 搜尋所有檔案 (含二進位)

搜尋範圍

限制搜尋

rg -m 5 pattern               # 每個檔案最多 5 個匹配
rg --max-depth 2 pattern      # 最大目錄深度
rg --max-filesize 1M pattern  # 限制檔案大小

反向搜尋

rg -v pattern                 # 顯示不匹配的行
rg --files-without-match pat  # 顯示不含匹配的檔案

檔案列表

rg --files                    # 列出所有會被搜尋的檔案
rg --files -g '*.go'          # 列出特定類型檔案

進階功能

多行搜尋

rg -U 'pattern1.*pattern2'    # 跨行搜尋 (multiline)
rg -U 'start.*\n.*end'        # 匹配多行內容

字串替換 (顯示)

rg 'pattern' -r 'replacement' # 顯示替換後的結果
rg '(\w+)@(\w+)' -r '$2:$1'   # 使用捕獲組

統計與分析

rg --count pattern            # 每個檔案的匹配計數
rg --count-matches pattern    # 總匹配次數
rg --stats pattern            # 顯示搜尋統計資訊

預處理與壓縮

rg -z pattern file.gz         # 搜尋壓縮檔案
rg --pre cat pattern          # 使用預處理器
rg --pre-glob '*.pdf' --pre 'pdftotext' pattern

效能優化

平行處理

rg -j 4 pattern               # 使用 4 個執行緒
rg -j 1 pattern               # 單執行緒執行

記憶體控制

rg --mmap pattern             # 使用記憶體映射 (預設)
rg --no-mmap pattern          # 不使用記憶體映射

快取與索引

rg --no-ignore-vcs pattern    # 不讀取 .gitignore
rg --no-ignore-parent pattern # 不讀取父目錄的忽略檔

特殊應用

搜尋特定內容

rg -t go 'func \w+' -o        # 提取所有函數名稱
rg -t js 'import.*from'       # 找出所有 import 語句
rg 'TODO|FIXME|XXX'           # 找出程式碼註解標記

二進位檔案

rg -a pattern                 # 搜尋二進位檔案
rg --binary pattern           # 同上
rg --text pattern             # 將二進位視為文字

編碼處理

rg -E auto pattern            # 自動偵測編碼
rg -E utf-8 pattern           # 指定 UTF-8 編碼
rg -E none pattern            # 不做編碼轉換

搜尋檔案內容類型

rg --type-add 'config:*.{yml,yaml,toml,json}' -t config pattern
rg --iglob '**/*.{log,txt}' pattern

除錯

偵錯資訊

rg --debug pattern            # 顯示詳細偵錯資訊
rg --trace pattern            # 顯示追蹤資訊
rg --files --debug            # 偵錯檔案列表

測試與驗證

rg --pcre2-version            # 顯示 PCRE2 版本
rg --type-list                # 列出所有類型定義

設定檔

使用設定檔

# ~/.ripgreprc 或專案 .ripgreprc
--smart-case
--colors=path:fg:green
--max-columns=150
export RIPGREP_CONFIG_PATH=~/.ripgreprc
rg pattern                    # 自動載入設定

實用範例

# 找出所有 Go 檔案中的 TODO
rg -t go 'TODO|FIXME' -C 2

# 搜尋 API 端點定義
rg -t go 'router\.(GET|POST|PUT|DELETE)' -o

# 找出大型函數 (超過 50 行)
rg -U '^func .*\{$' -A 50 | rg '^}$' -c

# 搜尋 SQL 注入風險
rg -t go 'Exec\(.*\+'

# 找出未使用的變數 (簡化)
rg -t go '^\s+\w+\s+:=' --no-filename | sort | uniq -c

# 比較兩個分支的差異
rg -l 'pattern' > /tmp/current.txt
git checkout other-branch
rg -l 'pattern' > /tmp/other.txt
diff /tmp/current.txt /tmp/other.txt

# 找出重複程式碼
rg -C 3 'pattern' | sort | uniq -d

# 效能分析:找出慢查詢
rg -t sql 'SELECT.*FROM.*WHERE' --stats

使用技巧

  1. 結合其他工具rg pattern | fzf (模糊搜尋)
  2. 管道處理rg -l pattern | xargs sed -i 's/old/new/g'
  3. 版本控制整合rg --files | entr rg pattern (自動重新搜尋)
  4. 別名設定alias rgg='rg --pretty --context 3'