你在當地的圖書館找到了一份工作,幫忙整理館藏的老書。學生讀者常常為了寫學期報告,想引用一些印象已經模糊的句子。與其一本一本從頭到尾手動翻閱,你決定做個小工具來掃描這些書,找出這些片段的句子。
在檔案中搜尋符合搜尋字串的行,並回傳所有符合的行。
Unix 的grep指令會在檔案中搜尋符合正規表示式的行。你的任務是實作一個簡化的 grep 指令,支援搜尋固定字串。
grep 指令接受 3 個引數:
接著它會讀取指定檔案的內容(依照指定的順序),找出包含搜尋字串的行,最後依照找到的順序回傳這些行。在多個檔案中搜尋時,每個符合的行前面會加上檔名和一個冒號(':')。
grep 指令支援下列旗標:
-n 在輸出的每一行前面加上行號和一個冒號(':'),行號放在檔名之後(如果有檔名的話)。-l 只輸出至少包含一行符合內容的檔案名稱。-i 使用不分大小寫的比較來比對。-v 反轉程式,收集所有不符合的行。-x 只搜尋整行都與搜尋字串完全相符的行。這個練習會介紹 anyhow crate,它能讓你輕鬆處理各種錯誤型別。它的目的,是確保你在撰寫應用程式時,不必煩惱被呼叫的函式回傳的是哪些特定的錯誤,只要在傳遞這些錯誤時做出正確的處理就好。
注意:撰寫函式庫時使用 anyhow 其實有點不太恰當,就像我們這裡的情況;撰寫函式庫時,自己寫一個 Error 列舉(或許可以借助 thiserror crate 這類輔助巨集的幫忙)會更明確、也更實用。不過,我們在這裡是刻意且明確地這麼做,用來示範這個 crate 的用法。
想進一步了解這個 crate,請參閱它的說明文件。
雖然這個練習只要求你實作grep最基本的功能,但其實有個專案用 Rust 完整重新實作了grep,那就是 ripgrep。
如果你喜歡用 Rust 重寫基礎工具程式這個點子,一定要看看下面這些專案: