UNIX 文字工具: 資料流編輯

sed 是 UNIX 的資料流編輯工具 (stream editor)。 幾乎所有 ed 編輯器可以使用的指令,sed 都可以用。 這裡我們只例舉一二,其餘的用法,等讀者自己學了 ed 之後,就自然明白了。

sed 的一個基本用途就是做字串置換,形式是

sed 's/OLD_STRING/NEW_STRING/' FILE
譬如我們想把 indian.txt 裡面的 little 全部換成 huge,可以說
sed 's/little/huge/' indian.txt
但是要小心,sed 是先搜尋 OLD_STRING,再將它置換成 NEW_STRING。 所以它符合一般的搜尋規則。也就是說,OLD_STRING 未必是一個獨立的字, 可能只是出現在一個字裡面的也算。 例如我們如果說
sed 's/Indian/Chinese/' indian.txt
則結果會是
one little
two little
three little Chineses
four little
five little
six little Chineses
seven little
eight little
nine little Chineses
ten little Chinese boys
顯然,Indian 換成了 Chinese,但是 Indians 也就換成了 Chineses。 後者是不對的。 怎麼辦呢,可以這樣說:
sed 's/little/huge/' indian.txt | sed 's/Indians/Chinese/' | sed 's/Indian/Chinese/' > chinese.txt
然後您可以 cat chinese.txt 看看,結果應該是
one huge
two huge
three huge Chinese
four huge
five huge
six huge Chinese
seven huge
eight huge
nine huge Chinese
ten huge Chinese boys

置換字串中可以出現空格、跳格。例如說

sed 's/00 / /' student.dat
可以剔除學號中的最後兩個 0。 我們故意在 00 後面添了一個空格,而且將它們三個字元換成一個空格。 這樣寫是為了避免在學號當中恰好有連續兩個 0 的號碼,像是
87007900 周淑文 女 zhousz
如果沒添那個空格,說了 sed 's/00//' student.dat 則會被置換成
877900 周淑文 女 zhousz
這就錯了。 由此可知,所謂置換,只會發生在每一列第一次發生 OLD_STRING 的地方。 第二次以後的 OLD_STRING 都不會被置換。

如果文字介面支援中文,而且那些中文字碼的次碼, 很幸運地沒有碰到文字介面的保留字元 (例如 ` ' \ { } | ), 則可以在字串中使用中文。例如

sed 's/ F / 女 /' student.dat | sed 's/ M / 男 /'
可以將英文的男女性別符號 (M F) 置換成中文。 注意我們在 F 和 M 的前後各加一個空格,以避免有某個人的姓名中, 恰好有個字的次碼是 F 或是 M 的 ASCII 號碼。 例如「霖」字的 Big-5 次碼就是 M 的 ASCII 號碼。 所以如果說了
sed 's/F/女/' student.dat | sed 's/M/男/'
就會產生如下的結果:
87250500 蔡君宗 男 caijz
87113600 鄒男鈞 男 zounj
87015800 褚永培 女 chuyp
87007900 周淑文 女 zhousz
87114100 杜嬤k雅 女 dulx
86014000 徐珍聖 男 xuzs
86110900 王琇凱 男 wangxk

習題

  1. 將 M 換成「男」字的時候,「霖」字變成了「嬤k」,請問 「男」的 Big-5 字碼和 k 有什麼關係?

[ 前一節 ]‧[ 後一節 ]‧[ 回目錄 ]



注意:此處所有文件均為原著,個別的版權宣告日後會一一公布, 整體版面設計亦尚未完成。但仍請勿抄襲文字與圖片,以免觸犯著作權法。

Created: Nov 19, 2000
Last Revised: Nov 19, 2000
© Copyright 2000 Wei-Chang Shann 單維彰

shann@math.ncu.edu.tw