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
>



