Ed 和 ed script

現在終於可以正式說明 ed 了。 其實和 ed 相似的還有 ex,雖然有點不同,但是使用上應該是不會有太大差別。 Ed 和 ex 的指令和 vi 的 line mode 的指令大部分是相同的, 可能有些指令無法在 ed 上運作,但是肯定可以在 ex 上運作。 下面的說明只有一些以前在 line mode 和全域代換時沒介紹的指令, 當然我只挑我認為有必要知道的介紹。 至少會讓你可以光靠 ed 就能夠編輯一份文件, 世事難料,說不定你會有倒楣到只能用 ed 的時候。

在 shell 環境下指令 ed filefile 是檔名。 這時候會進入 ed 工作環境,ed 會等著你輸入命令。 因為是列編輯器,所以你必須用指令 p 要求 ed 印出檔案內容。 例如指令 2p 會印出第二列,1,5p 會印出前面五列。

要加入一個新列,用指令 a。 例如 5a 會在第五列的下面列, 如果要再第一列前面加上一列,按 0a。 然後你可以輸入文字,每次你按下【 Enter 】會多出一個新列。 要離開時,在一列的開頭輸入句點【 . 】;句點本身不會存入檔案。

Ed 無法讓你修改一列的部分文字,所以你只能用代換指令慢慢代換。 但是你可以修改整列的文字,指令是 c。 例如 1c 會刪除第一列,然後開一個新列, 要離開的話一樣在一列的開頭輸入句點【 . 】。

如果要把數列合成一列,可以用指令 j1,5j 會把一到五列合成一列。 一般而言只會合成兩列,當你直接用 j 時,ed 會把目前這一列和下一列合成一列。 「目前這一列」是你目前移動到的位置,你可以輸入數字來指定, 但是這在每次執行指令後都會改變,所以最好還是在指令前面加上明確的數字。

要離開 ed,指令是 q。當你修改過檔案而尚未存檔時要離開要下指令 Q。 如果要存檔的話,可以下指令 w。要把更改後的文件另存新檔到 file 中, 指令是 w file

Ed script

當你要對很多個檔案做相同的編輯動作時,或許你可以試著用 ed script。 你把你要做的編輯指令放在一個檔案中,每個指令用換列字元隔開, 最後一個指令要是 w(write),否則就不會存檔。 例如檔案 do 的內容是這樣的:
1,$s/pig/dog/g
1,$s/windows/unix/g
13,25m30
g/bgs/d
w
這時你在 shell 下指令 ed - file < do, ed 會對 file 執行 script 中所列的動作, 然後存檔離開。指令中的 - 會抑止終端機訊息﹝不寫也沒關係﹞。 這部分請讀者要自行練習,光看這樣的說明恐怕不容易理解。

最後我要說一個 shell script。 讀者只要記得怎麼用就好,不知道其中的道理也沒關係。 編輯一個新檔案,就命名為 test。 內容如下:

for file in $*
do
     ed - $file < script
done
script 由你自己指定,我還是用 do。 編輯以後,下指令 chmod u+x test 把 test 改成可執行檔。 假設你有這些檔案:
rr01 rr02 rr03 rr04 rr05 rr06
你希望這些檔案都會被 do 處理,者時候你可以這樣下指令 test rr??。 然後上述的檔案就會送入 test 中,執行 ed - file < dofile 是送入的檔案。

介紹到這裡,我想應該是夠了。 Ed﹝或 ex﹞雖然不比 vi 好用,但是可以寫成 script。 而且說不定你真的會發生不得不用 ed 的情況, 學起來總是有好處的。 至於最後面的 shell script 和本節關係不大, 只不過看起來很方便,所以我就提了一下。 如果讀者真的感興趣,請自行找尋資料,我這邊就不多說了。

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


製作人、
修改記錄
李易霖 (02/8/19) ---