Unix/Linux 的 ripgrep 指令使用
為何要用 ripgrep?
- 超快
- 指令超簡潔
- 預設參數很人性化
- 支援自動排除 .gitignore
這些優點足夠讓我們在日常使用 rg 而不是 find,比如說找到 markdown 的指令,他們兩個要寫成這樣:
# rg 自動套用 .gitignore
rg '^#+.*' -g '*.md'
# grep 要手動設定所有 exclusion GLOB
grep '^#+' -rnE --include='*.md' --exclude-dir={.git,node_modules,cache,build,public} -H --color=auto
速度測試方面,rg 也爆打 gnu grep:
| 指令 | 時間 |
|---|---|
rg '^#+.*' -g '*.md' -uu | 0.269 |
grep '^#+' -rnE --include='*.md' -H --color=auto | 2.078 |
不過速度其實沒有很重要,我們通常很少找那麼多檔案,重點是指令超簡潔,使用原版 grep 想各種過濾 GLOB 的同時 rg 用戶已經又刷了兩個短影片了,總結來說 rg 在易用性和速度都全方面勝過內建的 grep,日常用 rg,腳本用 grep。
常用參數
--iglob: 無視大小寫的 GLOB-E: 設定檔案編碼-N: 不顯示行數-u: 等同--no-ignore,不排除 .gitignore 等設定檔案-uu: 等同--no-ignore --hidden,也不排除隱藏檔案和目錄-uuu: 等同--no-ignore --hidden --binary,也等同grep -r,搜二進制檔案--sort=path: rg 多線程搜尋,使用 sort 才可排序,也會被限制單線程搜尋
其餘和 grep 相同的參數
-l: 只印檔名-c: 只印檔名和行數-v: 反轉匹配-P: 使用 PCRE2-A/-B/-C: 印出上下文範圍--glob -g: 設定 GLOB-i --ignore-case: 忽略大小寫-w: 匹配整個文字相符
常用範例
清除指定行
Markdown 格式化不使用 prettier 了,所以把包含 prettier-ignore 的行全部刪除
rg "prettier-ignore" -l exampleSite/content -g "*.md" | xargs sed -i '/prettier-ignore/d'
mac 版本的 sed -i 要額外加上 '' 明確的告訴指令這是原地替換檔案。