grep
是查找檔案中內容的指令,在一般的作業情境下, grep
的功能是十分足夠了,但是在開發作業時, grep
的某些預設就顯得比較不合需求,例如只針對特定檔案、不會顯示行數與不會排除 .gitignore
中忽略的檔案等。雖然大部分的功能都可以藉由特定的參數設定完成,但是多了參數就多了需要記憶的部分,也比較不直覺,因此使用一個專為開發設計的查找內容工具是個提升產能的方式。
ripgrep
提供使用者直覺的內容查找指令,利用直觀的使用方式,我們可以輕鬆無負擔的找到需要的資料。
它有下面的特色:
.gitignore
,會將其所設定的範圍排除在搜尋外,並會自動忽略隱藏檔案與 binary 。grep
的功能,像是顯示結果的上下文、搜尋多個 patterns 、搜尋字串的高亮等。使用 Homebrew 安裝 ripgrep
:
brew install ripgrep
安裝完成後,就可以使用 rg
指令叫用 ripgrep
了。
rg --help
--help
參數會列出說明供使用者參照。
rg
的使用需要帶有 PATTERN
參數,這就是搜尋的目標。
rg ripgrep
上例的 ripgrep
就是 PATTERN
參數,這個指令會去查找當前目錄下所有檔案內容中有 ripgrep
的結果。
如果想要搜尋特定檔案,可以使用第二個參數指定檔案。
rg ripgrep README.md
上例只會查找 README.md
中的內容。
ripgrep
支援正規表達式的搜尋方式,因此你可以使用正規表達式的語法設定搜尋的 PATTERN
。
rg ' rip\w+'
上例會搜尋 rip
字串前面是空白,並且後面接一個以上字元的結果。
關於正規表達式的設定方式,可以參考 Docs.rs 的文件。
上面就是 ripgrep
主要的使用方式,接下來會介紹幾個常用的搜尋情境供使用者參考。
ripgrep
的搜尋會依照對應的規則忽略特定的檔案,如果在搜尋時,遇到下面的情況,會對其做忽略的動作:
.gitignore
(全域及本地)。.ignore
,如果與 .gitignore
衝突,會以 .ignore
為先。.rgignore
,如果與 .ignore
衝突,會以 .rgignore
為先。ripgrep
用 NUL
判斷是否為 binary )。ripgrep
提供了各式的參數,供使用者需要查詢這些忽略檔案時使用:
--no-ignore
將 ignore 檔案包含在搜尋範圍內。--hidden
將隱藏檔案與目錄包含在搜尋範圍內。--text
(或 -a
)將 binary 包含在搜尋範圍內。--follow
(或 -L
)將 symlinks 包含在搜尋範圍內。ripgrep
另外提供了 --unrestricted
(或 -u
)、 -uu
與 -uuu
:
-u
:搜尋範圍包含 ignore 檔案設定的檔案或目錄。-uu
:搜尋範圍包含 ignore 檔案設定與隱藏的檔案或目錄。-uuu
:搜尋範圍包含 ignore 檔案設定、隱藏的檔案與 binary 檔案或目錄。如果不知道為什麼找不到目標的結果時,可以使用
--debug
參數,它會列出細節供使用者參考。
在指令中使用 -g
參數,可以自己指定搜尋範圍。
rg ripgrep -g '*.md'
上例就只會搜尋 .md
結尾的檔案。
在指令中使用 --type
(或 -t
)參數,可以設定要搜尋的類型。
rg ripgrep --type md
# equal
rg ripgrep -tmd
上例只會搜尋 md
類型的檔案。
另外,也可以使用 -T
排除特定的類型:
rg ripgrep -Tmd
這樣就不會搜尋 md
類型的檔案了。
grep
預設不是給予開發者使用,因此部分指令會較不直觀,需要特別去記憶,拖慢查找的時間。ripgrep
針對開發時的情境設計指令,因此可以輕鬆且直覺的使用 ripgrep
來針對開發相關的檔案做檢索。ripgrep
指令為 rg
。rg PATTERN
會搜索當前目錄下所有檔案中含有 PATTERN
內容的結果。rg PATTERN PATH
會搜索特定 PATH 中含有 PATTERN
內容的結果。PATTERN
可以是正規表達式。rg
預設搜尋時會忽略部分檔案,其忽略的範圍如下:
--no-ignore
與 -u
。--hidden
。--text
。--follow
。-uu
。-uuu
。-g
指令查找的 glob 。-t
指定查找檔案的類型。-T
指定排除的檔案類型。