你在當地的圖書館找到了一份工作,幫忙整理館藏的老書。學生讀者常常為了寫學期報告,想引用一些印象已經模糊的句子。與其一本一本從頭到尾手動翻閱,你決定做個小工具來掃描這些書,找出這些片段的句子。
在檔案中搜尋符合搜尋字串的行,並回傳所有符合的行。
Unix 的grep指令會在檔案中搜尋符合正規表示式的行。你的任務是實作一個簡化的 grep 指令,支援搜尋固定字串。
grep 指令接受 3 個引數:
接著它會讀取指定檔案的內容(依照指定的順序),找出包含搜尋字串的行,最後依照找到的順序回傳這些行。在多個檔案中搜尋時,每個符合的行前面會加上檔名和一個冒號(':')。
grep 指令支援下列旗標:
-n 在輸出的每一行前面加上行號和一個冒號(':'),行號放在檔名之後(如果有檔名的話)。-l 只輸出至少包含一行符合內容的檔案名稱。-i 使用不分大小寫的比較來比對。-v 反轉程式,收集所有不符合的行。-x 只搜尋整行都與搜尋字串完全相符的行。PowerShell 的函式支援切換參數,其行為類似命令列中的旗標。
為了遵循 PowerShell 為 Cmdlet 及其屬性取詳細且冗長名稱的慣例,本練習使用的旗標名稱也做了調整,以反映這門語言的做法。
Line(-n):在輸出的每一行前面加上行號和冒號(':'),並把行號放在檔名之後(若有檔名的話)。File(-l):只輸出至少含有一行符合內容的檔案名稱。Insensitive(-i):比對時忽略大小寫。Invert(-v):反轉程式的行為,收集所有不符合的行。Whole(-x):只搜尋搜尋字串與整行完全相符的行。你的重點應該放在實作 grep 函式,不用擔心如何正確取得檔案路徑。
本練習會在測試套件中提供 3 個必要的文字檔:iliad.txt、midsummer-night.txt和paradise-lost.txt,你只要用檔名字串(而不是平常的檔案路徑)搭配Get-Content,就能取得它們的內容。
PowerShell 確實有個類似grep的 Cmdlet,叫做Select-String,如果你有興趣,可以在這裡了解更多。
在本練習中,任何時候都不應該使用Select-String。