Grep

Grep

中等

簡介

你在當地的圖書館找到了一份工作,幫忙整理館藏的老書。學生讀者常常為了寫學期報告,想引用一些印象已經模糊的句子。與其一本一本從頭到尾手動翻閱,你決定做個小工具來掃描這些書,找出這些片段的句子。

說明

在檔案中搜尋符合搜尋字串的行,並回傳所有符合的行。

Unix 的grep指令會在檔案中搜尋符合正規表示式的行。你的任務是實作一個簡化的 grep 指令,支援搜尋固定字串。

grep 指令接受 3 個引數:

  1. 要搜尋的字串。
  2. 零個或多個用來調整指令行為的旗標。
  3. 一個或多個要搜尋的檔案。

接著它會讀取指定檔案的內容(依照指定的順序),找出包含搜尋字串的行,最後依照找到的順序回傳這些行。在多個檔案中搜尋時,每個符合的行前面會加上檔名和一個冒號(':')。

旗標

grep 指令支援下列旗標:

  • -n 在輸出的每一行前面加上行號和一個冒號(':'),行號放在檔名之後(如果有檔名的話)。
  • -l 只輸出至少包含一行符合內容的檔案名稱。
  • -i 使用不分大小寫的比較來比對。
  • -v 反轉程式,收集所有不符合的行。
  • -x 只搜尋整行都與搜尋字串完全相符的行。

字詞

實作:

  • grep ( pattern flags files -- lines )

pattern是要搜尋的字串,flags是由零個或多個旗標字串組成的陣列,這些旗標字串可以是"-n"、"-l"、"-i"、"-v"和"-x",而files是一個或多個檔名組成的陣列。將符合的行(包含任何所要求的檔名與行號前綴)以字串陣列回傳。

指定-l旗標時,回傳至少包含一處符合的檔案名稱所組成的陣列。

讀取檔案

使用file-lines讀取檔案中的各行,並傳入編碼:

USING: io.encodings.utf8 io.files ;

"iliad.txt" utf8 file-lines
! => { "Achilles sing, O Goddess! Peleus' son;" ... }

這三個測試用檔案(iliad.txt、midsummer-night.txt和paradise-lost.txt)會隨練習一起放在工作目錄中,所以直接以檔名讀取就能運作。

透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Factor Exercism

準備好開始 Grep 了嗎?

註冊 Exercism,透過 47 個概念163 個練習 和真人引導來學習並精通 Factor,全部免費。