反白練習

請將 drgeo.txt 這個文字檔取回您的 Linux 機器, 並用 less drgeo.txt 打開檢視。 (這個文字檔是從 Dr. Geo II 的網站下載一個壓縮檔, 然後用 unzip -v drgeo-oneclick-*.zip > drgeo.txt 所產生的。 又略加編輯, 縮短路徑名稱。) 關於 less 指令, 請參考 less 的基本操作

在 less 內搜尋, 看到反白的結果

先按 / 表示搜尋, 次輸入 regexp: [0-9]+% 表示要搜尋 「一串數字之後跟著百分比符號」, 最後按 Enter, 出現如上圖反白。 在 less 裡面, 沒有 \d 簡寫可用, 必須寫 [0-9] 表達 「一個數字」。

如何令第一個欄位 "Length" 底下的數字都反白呢? 先試試看: [0-9]+ 結果所有的數字都反白了。 改用 ^\s*[0-9]+ 就抓出位於列首, 空白之後的一串數字。 如果資料檔當中, 每一列上可能有數個欄位都符合想抓的 regexp, 我們就將 regexp 再寫長一點, 用前後延申的字串將真正有興趣的部分與其他相似字串區隔開來。 例如這裡, 「位於開頭」 就是足以將 Length 欄位特別挑出的特性。 至於多抓到的部分 (例如這裡的 「空白」), 不必擔心, 後面會學到: 用小括弧可把真正有興趣的部分精確取出。

往下看之前, 請先自己試試看:

  1. 能否令第二個欄位反白? 第四個呢? 第五個呢? ... 第三欄比較沒有特色, 可以和第四欄一起抓; 倒數第二欄 CRC-32 也比較難單獨抓, 可以和最後一欄一起抓。
  2. 如何抓出所有的副檔名? (.ini .sh .exe ...)
  3. 如何抓出所有的目錄名稱? (dg/ c/ res/ MacOS/ Linux686/ ...)

有時候用簡單的 regexp 可以抓出九成九我們需要的資料, 但會遺漏幾筆或多抓到幾筆不需要的資料。 目前我們先不擔心這些狀況。 事實上許多時候若能用 regexp 處理九成九的資料, 剩下的用手工或再一次的 regexp 另外處理, 也已經夠方便了。


  1. Stored|Defl:N 抓第二欄 "Method"。 這裡的 | 表示 「這一串或那一串」。 注意: 跟 [13579] 「這一個字元或那一個字元」 不太一樣。
  2. [0-9]+\s+[0-9]+% 同時抓第三欄 "Size" 及第四欄 "Ratio" 。 後續可用小括弧將兩者分別抓出。 後詳。
  3. [0-9][0-9]-[0-9][0-9]-[0-9][0-9] 抓出第五欄 "Date"。
  4. [0-9][0-9]:[0-9][0-9] 抓出第六欄 "Time"。
  5. [0-9a-f]{8} 」 抓出第七欄 "CRC-32"。 注意: 首尾各多放一個空格; 或者放 \b 也可以, 以免抓到 9 位或 9 位以上的十六進位數字。 這裡的 {8} 表示 「前面的東西重複出現 8 次」。 不小心多抓到 「整個壓縮檔的大小 11474421」。
  6. \S+$ 抓出第八欄 "Name"。 這裡的 \S 表示 「任何一個非空白字元」。 "My Squeak/" 抓得不正確, 因為檔名裡面有空格。
  7. \.\w+$ 抓出副檔名。
  8. \w+\/$ 抓出目錄名稱。 "My Squeak/" 還是抓得不太正確。