Hades said:為了版權考量,別再外流了.... 

                              The Ed Primer
				 --or--
	Your Introduction To The Wonderful World Of Programming With Ed!

0. 前言: 符號說明

在所有範例中:
在 <...> 內的文字, 無須完全一字不漏的鍵入, 可以用其它字來取代
如, '<number>p' 可為 '4p' 或 '27p' 等
在 [..] 內表示是可選擇的
<x|y> 表 <x> 或 <y>

提示符號:
>  表示在lpmud中
:  表示在ed命令模式中
*  表示在ed插入模式中

--The author/editor

I. 初級命令:  'ed', 'a', 'i', 'w', 'q' 

由lpmud進入ed的方式有下列兩種
> ed <filename>
    或
> ed <dummy filename>.

第一種用於編輯以存在之檔案, 第二種則是造一新檔
dummy filename 可為任何尚未存在之檔案名稱

在你ed中時, 提示符號會變成':'. 此時可以輸入ed的命令
如果你正在編輯一個新檔, 可以用'a'或'i'進入插入模式, 這兩者間之差異, 在以後之
敘述中將會顯現出來
在插入模式中, 提示符號會變成'*'. 此時你可以輸入你的檔案, 在任何時候, 打'.'即可
離開插入模式

當輸入完成而且已返回命令模式時(提示符號為':'), 命令'w'可將檔案以你所指定的檔案
名稱儲存, 例如:

:w myfile.c

命令'q'可退出ed

總結:

> ed <file | dummy file> 進入ed
在命令模式下 'a' 及 'i' 可進入插入模式
   ---> 在以下之敘述中, 除非有特別說明, 將假設所有命令都是在命令模式下輸入
'.' 由插入模式返回命令模式
'w <file>' 儲存檔案
'q' 離開ed


II. 編輯已存在之檔案(命令 'ed', 'a', 'c', 'd', 'i', 'l', 'p', 'w', 'z', '=')

欲編輯一個已存在之檔案可使用:

> ed <filename>

這會使你進入ed, 與編輯新檔案時不同的是, 此時已有資料在buffer中, 使用'.p'可看到
你目前所在的那一行

命令'p'可顯示一至數行的資料, 其語法為:
'p' 或 '.p'* 顯示目前你所在的那一行, <number>p' 顯示行號 <number>.
 '<number1>,<number2>p' 顯示由<number1>至<number2>的所有資料, 此時, <number1>
必須小於或等於<number2>. 使用這二個用法時, 所有行號都必須已經存在, 否則命令會
失敗
命令'l'與'p'在大部分狀況下其功能是相同的, 其不同點是, 'l'會顯示出一些'看不到'
的字元如'換行'(顯示出'$'). Tabs則完全看不到. 'z'會以'p'的方式顯示出21行,
(也就是說控制字元仍然看不到). 'z'之前可附加你所要開始那一行的行號

命令<number>會將你帶到第'number'行

在第I節提到的命令'i' 及 'a'這時候便顯現出其明顯不同之處, 'i'由你所在的那一行
之前開始插入, 'a'則是由你所在的那一行之後開始插入. (使用 '.' 或 '.p' 可顯示
你在哪一行)
'i' 和 'a' 之前也可以附加上<number>, 例如'<number>i'和'<number>a', 會在在進入
插入模式前將你置於第<number>行

命令'='可用於找出你目前在第幾行

命令'd'刪除你目前所在那一行, 'd'和'p'及'l'一樣, 可以作用在單獨一行或是第幾行
到第幾行

命令'c'用於改變行內資料, 基本上它的用法和'd'類似, 但不像使用'd'時你仍會在命令模
式下, 'c'會進入插入模式, 以便你能"置換"已被拿掉之資料

最後, 'w'之後不接'<file>'時會將你正在編輯的檔案, 以它原來的檔名儲存

註: * 表數字, '.' 表目前所在那一行; '$' 表檔案最後一行

範例:
> ed a
:a
*This is line 1.
*This is line @.
*This is line 3.
*This is line 5.
*This is too many lines.
*.
:1,3p
This is line 1.
This is line @.
This is line 3.
:=
3
:5l
This is too many lines.$
:5d
:1,$p
This is line 1.
This is line @.
This is line 3.
This is line 5.
:2c
*This is line 2.
*.
:1z
This is line 1.
This is line 2.
This is line 3.
This is line 5.
:4i
This is line 4.
:1,$p
This is line 1.
This is line 2.
This is line 3.
This is line 4.
This is line 5.
:w file.txt
:q
> ls
  Total 1
    1 file.txt
>

總結:

'p' 及 'l' 用以顯示在一特定定範圍內之資料, 'l'顯示一些"看不到"的字元
'z' 以'p'的格式顯示21行資料
'=' 顯示目前所在行的行號
'd' 刪除一行
'c' 置換一行, 先刪除, 然後進入插入模式
-- 可將'.'及'$'視為數字來使用, '.' 表目前所在行,  '$'表檔案最後一行

III. 進階編輯: (命令 's')

命令's'用於取代資料, 格式為:

:[<number1>[,<number2>]]s<delimiter><pattern><delimiter><sub>[<delimiter>gp]

此命令, 乍看之下很複雜, 但它可能是ed中功能最強的

<...>之解釋:
<number1> 與 <number2> 表示取代之範圍. 若'<number2>'省略, 則有效範圍僅為
<number1>這一行. 若'<number1>'也省略, 則內定為取代目前所在那一行

<delimiter>只是用來區隔的一個簡單字元而已. 但應注意的是'<delimiter>'在<pattern>
或<sub>都不發生作用. 雖然任何字元都可以作為<delimiter>, 但最常選用的有'/'及 '!'

<pattern>是欲改變之字串. <sub>則是欲取代<pattern>的字串. 如果<pattern>的第一個
字元為'^', 則表示這是一行的開始. 同樣的, 若最後一個字元是'$', 則表示是一行的結
束

[gp]是用來使得整個置換過程擴及一整行(而不是只影響單一字串而已), 並且立刻顯示
更新後的那一行. 注意: 如果g和p同時被使用, 則g必須放在p之前

範例:

:.
This is line nubmer 3.
:s/bm/mb/p	  <--- 注意: '/' 在此作為區隔子(delimiter)用
This is line number 3.
:

:.
Thsi si line 3.
:s!si!is!p	  <--- 此處之區隔子為'!'.
This si line 3.   <--- 注意: 只有第一個'si'被改變
:

:.
Thsi si line number 3.
:s!si!is!gp	  <--- 此處之區隔子為'!'
This is line number 3.
:

:3,5p
This is lize 3.
This is lize 4.
This is lize 5.
:3,5sqzqnqp	 <--- 此處之區隔子為'q'.
This is line 3.
This is line 4.
This is line 5.
:

一般應注意事項:
要做全域制換(global substitution)使, 使用:
:1,$s/<pattern>/<sub>/g

注意在<pattern>中如果使用', '(', ')', '&', '*', '|', '[', '^', 及 ']'等字元
都必須在前面加上'\'
'\'雖然也可以用在<sub>與<pattern>中, 但必須要具備有很好的計巧才能用得正確
作者建議初學者使用命令'c'來做'\'這個字元所能做的取代功能

在<pattern>中能夠使用的特殊字元:
.	配合任何字元
x*	配合任何數字x (0 或更大的數).
[abc]	配合 'a', 'b' 或 'c'.
[0-9]	配合任何阿拉伯數字 0 - 9.
[a-z]	配合任何小寫字母
[^0-9]	配合除了在0-9間之阿拉伯數字以外的所有字元

& 在做取代工作時, 可用於表示要被取代的資料

範例:
:.
This is a lazy line, lying abed.  It is also silly; abcd.
:s/ab.d/ABCD/gp
This is a lazy line, lying ABCD.  It is also silly; ABCD.
:

範例:
:.
This is a long line that is being used to demonstrate a silly example.
:s/l.n./&foo/
This is a longfoo linefoo that is being used to demonstrate a silly example.

III-I/II. (3.5, for those who can't figure that out.) Author's Interjection:
	 (符號'<range>')

為了方便起見, <number1>,<number2><command>將用<range><commmand>來表示

IV. 其他進階命令及相關之捷徑
    (命令 'e', 'E', 'f', 'j', 'k', 'Q', 'm', 'r', 't', 'x', '!')

命令'e', 'E', 及 'r' 皆可用於將一外部檔案讀入緩衝區. 'e <file>'將<file>讀入緩
衝區, 並且會清除在緩衝區內所有的資料, 因其具有破壞性, 所以在執行這命令前, 緩
衝區內正確的資料必須先儲存. 'E <file>'的作用和'e <file>'相同, 但會忽略掉目前在
緩衝區內之資料是否已儲存.

'<number>r <file>'將<file>讀入, 並置於第<number>行之後. 若省略<number>, 則內
定為目前所在那一行

'Q' 和 'x' 可以像 'q' 一樣用於離開ed.  'q' 在緩衝區內的資料已儲存後才能用於
離開ed.  'Q' 不管緩衝區內之資料是否儲存, 皆可用於離開ed. 'x'將緩衝區內之資料
儲存於內定的檔案名稱, 然後離開ed, 要注意的是, 如果沒有內定的檔案名稱, 則命令
'x'會失敗

'<range>j'會將在<range>內之所有資料置於同一行

'<number>k<marker>'會將<marker>指定給第<number>行.  <marker>可為任何小寫字母
被標記的那一行稱為"'<marker>". 例如:

:5kd
:1,'dp

將第五行標記為"d"然後顯示1-5行.

'f <file>'將內定之檔案名稱設定為(命令'w'及'x'所使用) <file>.

't' 及 'm' 都是用於移動整塊的資料, 格式為:
:<range>t|m<number>
其中<range>是欲移動的資料, 而移動後, 資料會接在第<number>行之後.
't'會'轉移'資料, 但在原來所在位置, 會留有一份原資料, 基本上它是一個'copy'的命令
'm' 是 'move', 將資料由原先之位置, 移到另一個新的位置

'!'用於在ed中執行lpmud的命令, 它可在命令模式或插入模式中使用. 例如:
:!'Wait, please; I'm in ed.
Guest says: But I want to talk.
:i
*!'I said wait, please.
*


總結:
'e', 'E', 和 'r' 用於將外部檔案讀入緩衝區
'Q' 不管是否已儲存, 離開ed
'x' 儲存並離開ed
'f' 改變內定之檔案名稱
'j' 將數行結合成一行
'k' 標記某些行
't' 轉移或copy數行資料
'm' 移動數行的資料
'!' 在命令模式或插入模式下執行lpmud的命令

V. 搜尋(命令 'g', 'v', '?', '/')

'/' 及 '?' 用於尋找在緩衝區內之敘述.  '/<string>' 向後搜尋<string>,
而'?<string>'則是向前搜尋.
'/' 和 '?' 如果沒有參數則內定為使用上一個使用過的參數, 如果上一個使用過的參數
不存在, 則會產生錯誤

'g' 和 'v' 使用類似的格式:
:<range>g|v/<string>/<command>

'g' 和 'v' 在<range>內搜尋<string>
'g' 對在<range>內含有<string>的資料執行<command>
'v' 對所有不含<string>的資料執行<command>

<command>可為下列命令中之一: 's', 'l', 'p', 'd', 'm', 'r'. 這些命令的參數在此
情況下仍可正常作用

'/' 和 '?' 都可作用於第一個找到之<string>. 例如:

:/foo/s/x/ox/gp

會將接下來所有含有'foo'的那一行中, 所有的'x'都用'ox'取代, 並且將你的所在行
移到那一行去
同樣的:

:?bar?=

你可以得到在你所在行之前, 'bar'第一次出現的那一行的行號, 同時你會被移到那一行去
範例:

:1,$p
This is a test.
This is line two of the test.
There are more than two lines.
This is the last line.
:1,$g/two/l
This is line two of the test.$
There are more than two lines.$
:1,$v/two/d
:1,$p
This is line two of the test.
There are more than two lines.
:?test
This is line two of the test.
:.p
This is line two of the test.
:/There
There are more than two lines.
:Q
>



