按行编辑文本。
ed [ -p String] [ -s | -] [File]
red [ -pString] [ -s | -] [File]
命令ed启动 ed 编辑器行编辑程序。ed 编辑器一次只能作用于一个文件,它将文件拷贝到临时的编辑缓冲区中,对该副本进行更改。ed 编辑器属于一类也包含了edit编辑器、ex编辑器和vi编辑器的编辑器族。ed 编辑器在缓冲区中做出您所指定的更改。它直到您使用 write(w)子命令时才会改变文件本身。
当您使用ed命令启动 ed 编辑器时,您可以指定您想要编辑的文件的名称,或者您可以使用e子命令。当ed命令往缓冲区中读入新的文件时,该文件的内容将替代该缓冲区以前的内容。
命令red是命令ed的受限版本,是和受限的 shell(rsh)一起使用。使用 red 命令,您就只能编辑当前目录或 /tmp 目录中驻留的文件;您不能使用 ! 子命令。
由 0 个、 1 个或 2 个地址,后接一个单字母子命令,并且再在这个子命令后接上其可选参数,这样就组成了一条 ed 编辑器的子命令。这些地址指定缓冲区内的一行或几行。因为每个子命令都有缺省地址,所以通常都不必指定地址。
ed 编辑器允许只编辑当前行,除非您指定缓冲区内的另一行。您只能移动和拷贝整行的数据。ed 编辑器对于编辑大文件或者对于在 shell 程序中进行编辑很有用。
命令方式 | 在命令方式中,ed 编辑器识别并运行子命令。当您启动 ed 编辑器时,它处于命令方式。输入 .(句点)并按 Enter 键来确认您处于命令方式。 |
文本输入方式 | 在文本输入方式中,ed 编辑器允许您往文件缓冲区中输入文本,但是不识别子命令。请您用a 子命令、c子命令,或i子命令进入文本输入方式。通过在行的开头单独输入一个 .(句点)以退出文本输入方式并返回命令方式。要在文本输入方式下将 .(句点)放入缓冲区中,请输入一个字符,后面跟上 .(点)。然后,退出文本输入方式并使用 s 子命令除去该字符。 |
下面的列表提供了 ed 编辑器的最大限度。
最大行数取决于可用的内存大小。最大的文件大小取决于可用的物理数据存储量(磁盘或磁带机),或是取决于用户内存中允许驻留的最大行数。
-p String | 将参数 String 设为编辑器的提示符。String 的缺省值是空值(无提示符)。 |
-s | 用子命令e、子命令r和子命令w禁止编辑器显示的字符计数。该标志还取消了 e 子命令和 q 子命令的诊断消息,并且取消了! 子命令后的!(感叹号)提示符。 |
- | 提供和 -s 标志一样的功能。 |
ed 编辑器支持有限格式的专门的模式匹配字符,这样,您就能将这些字符用作正则表达式(RE)来构造模式字符串。您可以用地址中的这些模式指定几行,以及在某些子命令中指定行的某些部分。
下面的 RE 与单个字符或者整理元素相匹配,如下所示:
下面的规则描述了如何从 RE 构造模式:
ab*cd
和下面的每个字符串相匹配:
acd abcd abbcd abbbcd
但不匹配下面的字符串:
abd
如果存在一个选项,选择最长、最靠左的匹配字符串。例如,给定下面的字符串:
122333444
模式 .* 匹配 122333444,模式 .*3 匹配 122333,而模式 .*2 匹配 122。
\{m\} | 精确匹配 m 次出现的、与该 RE 匹配的字符。 |
\{m,\} | 与至少 m 次出现的、与该 RE 匹配的字符相匹配。 |
\{m,n\} | 与重复从 m 到 n(含 n)之间任意次数的、与该 RE 匹配的字符相匹配。 |
例如下面的模式:
\(A\)\(B\)C\2\1
匹配字符串 ABCBA。您可以嵌套子模式。
您可以限制模式,让它只匹配一行中的第一段、最后一段或者整行。空模式,//(两个斜杠),是重复上一个模式。
参数 ^Pattern 只匹配从行的首字符位置开始的字符串。
参数Pattern$ 只匹配以行的最后一个字符(不包括换行字符)为结尾的字符串。
参数 ^Pattern$ 限制该模式,使其匹配整行。
ed 编辑器使用三种类型的地址:行号地址、相对当前行的地址和模式地址。当前行(通常是子命令所作用的最后一行)是缓冲区中的参考点。
您可以用行号地址来做下面的工作:
不接受地址的子命令将地址的出现认为是错误。接受地址的子命令可以使用赋予或缺省的地址。如果提供的地址过多,命令就使用最后(最右边)的那些地址。
在大多数情况下,用逗号(,)将地址分隔(例如 2,8)。分号(;)也可以分隔地址。地址之间的分号使得 ed 编辑器设置当前行为第一个地址,然后计算第二个地址(例如,为搜索设置起始行)。在一个地址对中,第一个地址的数值必须小于第二个地址。
您可以使用行号和符号地址来执行下面的任务:
一个 .(句点)寻址当前行。.(句点)是多数 ed 编辑器子命令的缺省值,并且不需要进行指定。
要寻找缓冲区中指定的一行,请输入:
Number$
其中参数Number代表行号。示例:
2253$
寻址行号 2253 的行作为当前行。
要寻找缓冲区内第一行之前的行,请输入:
0
要寻找缓冲区的最后一行,请输入:
$
要指定当前行之上指定数目行的一个地址,请输入:
-Number
其中参数Number指的是您想要寻找的行是当前行之上的第多少行。示例:
-5
寻找当前行之上的第 5 行,并作为新的当前行。
您也可以只指定一个 - 来寻找当前行之上紧接当前行的一行。减号具有累计效果。例如,地址 - -(两个减号)寻找当前行之上两行的行。
要指定当前行之下指定数目行的地址,请输入:
+Number
其中参数Number指的是您想要寻找的行是当前行之下第多少行。+(加号)是可选的。示例:
+11
寻找当前行之下的第 11 行,并将其作为新的当前行。
您也可以只指定一个 + 来寻找当前行之下紧接当前行的一行。+ 具有累计效果。例如,地址 + +(两个加号)寻找当前行之下两行的行。
要寻址第一行到最后一行,请输入:
,
,(逗号)代表了地址对 1,$(从第一行到最后一行)。第一行成为当前行。
要寻址当前行到最后一行,请输入:
;
;(分号)代表了地址对 .,$(从当前行到最后一行)。
要寻址一组行,请输入:
FirstAddress,LastAddress
其中,参数FirstAddress是您想要寻址的组中的第一行的行号(或符号地址),而参数LastAddress是该组最后一行的行号(或符号地址)。该组中的第一行成为当前行。示例:
3421,4456
从行 3421 寻址到行 4456。行 3421 成为当前行。
要寻找含有匹配字符串的下一行,请输入:
/Pattern/
其中,参数 Pattern 是字符串或正则表达式。从当前行之后的行开始搜索,当找到该模式的匹配时停止。如果必要的话,搜索到达缓冲区的末尾,环绕到缓冲区的开始,并且继续搜索直到找到匹配或者返回到当前行。例如:
/Austin, Texas/
寻址含有 Austin、 Texas 的下一行,并将其作为当前行。
要寻址包含模式匹配的上一行,请输入:
?Pattern?
其中,参数 Pattern 是字符串或正则表达式。?Pattern? 结构,和 /Pattern/ 一样,可以搜索整个缓冲区,但是它往相反的方向搜索。例如:
?Austin, Texas?
寻址含有 Austin、Texas 的上一行,并将其作为当前行。
要寻址用子命令 k 标记过的行,请输入:
'x
其中参数 x 是从 a 到 z 的一个小写字母。例如:
'c
是用子命令 k 寻找标记为 c 的行。
用 ed 编辑器子命令执行下面的操作:
在大多数情况下,您只能在一行上输入一条 ed 编辑器子命令。但是,可以将 l(列表)和 p(打印)子命令添加给除了 e(编辑)、E(编辑)、f(文件)、q(退出)、Q(退出)、r(读)、w(写)和 !(操作系统命令)子命令之外的任何子命令。
子命令e、f、r和w接受文件名作为参数。ed 编辑器存储子命令使用过的最后一个文件的名称,并将其作为缺省文件名。如果不赋予文件名,下一个子命令e、E、f、r或w就使用该缺省的文件名。
ed 编辑器在出现错误的情况下给出两个消息之一:? (问号)或?File。当 ed 编辑器收到中断信号(Ctrl-C 按键顺序)时,它显示一个 ? 并返回命令方式。当 ed 编辑器读文件时,它废弃 ASCII 空字符和最后一个换行字符之后的所有字符。
您可以使用 ed 编辑器的子命令执行下面的任务:
您可以使用不同的 ed 编辑器子命令在不同的位置添加文本。请使用前面的格式来执行下面的编辑任务:
Addressa[l][n][p]其中参数Address是行号,插入的文本将在该行之后。可选的子命令l、n和p显示所添加的文本。
Addressi[l][n][p]其中参数Address是行号,插入的文本应该在该行之前。可选的子命令l、n和p显示所添加的文本。
[Address]g/Pattern/a[l][n][p]其中Address是可选的参数,它指定了搜索Pattern参数中指定的模式的行的范围。参数Pattern是字符串或正则表达式。如果您省略了参数Address,ed 编辑器就在整个文件中搜索包含模式的行。可选的子命令l、n和p显示所添加的文本。
\
\并敲 Enter 键。您所输入的文本将被添加到包含了命令所指定的模式的每一行之后。
[Address]g/Pattern/i[l][n][p]其中Address是可选的参数,它指定了搜索Pattern参数中指定的模式的行的范围。参数Pattern是字符串或者正则表达式. 如果您省略了参数Address,ed 编辑器就在整个文件中搜索包含模式的行。可选的子命令l、n和p显示所添加的文本。
\
\并敲 Enter 键。您输入的文本将被添加到包含了命令中所指定的模式的每一行之前。
[Address]g/Pattern/a[l][n][p]其中Address是可选的参数,在它指定范围内的行中,搜索不包含Pattern参数所指定的模式的行。参数Pattern是字符串或正则表达式。如果您省略参数Address,ed 编辑器就在整个文件中搜索不包含该模式的行。可选的子命令l、n和p显示所添加的文本。
\
\并敲 Enter 键。您所添加的文本被添加到不包含命令所指定的模式的每一行之后。
[Address]g/Pattern/i[l][n][p]其中Address是可选的参数,在它指定范围内的行中,搜索不包含Pattern参数所指定的模式的行。参数Pattern是字符串或正则表达式。如果您省略了参数Address,ed 编辑器就在整个文件中搜索不包含该模式的行。可选的子命令l、n和p显示所添加的文本。
\
\并敲 Enter 键。您输入的文本被添加到不包含命令中所指定的模式每一行之前。
您可以用 ed 编辑器以几种不同的方式更改文本。请使用前面的格式来执行下面的编辑任务:
Addressc[l][n][p]其中参数Address是要更改的一行或一组行的地址。可选的子命令l、n和p显示更改的文本。
Addressg/Pattern/c[l][n][p]其中参数Address是一组行的地址,您想要在这组行中搜索参数Pattern所指定的模式。可选的子命令l、n和p显示更改的文本。
\
\并敲 Enter 键。
Addressv/Pattern/c[l][n][p]其中参数Address是一组行的地址,您想要在这组行中搜索参数Pattern所指定的模式。可选的子命令l、n和p显示更改的文本。
\
\并敲 Enter 键。
(.,.)(.,.)tAddress [p] [l] [n] | 子命令t(转移)将指定行的副本插入到参数Address所指定的行之后。子命令t接受 0 地址,认为是将行插入到缓冲区的起始处。
子命令t将拷贝的最后一行设为当前行。 如果您想要显示转移的文本,请输入可选的子命令l(列表)、n(行号)或p(打印)。 |
拷贝一行或一个行的集合是将指定的行留在它们初始的位置,而将副本放入新的位置。您可以通过指定地址或模式来选择要拷贝的行。请使用前面的格式来执行下面的编辑任务:
tAddress[l][n][p]其中参数Address是行号或符号地址,您想要将当前行的副本放置到该行之后。可选的子命令l、n和p显示拷贝的行。
LineNumbertDestinationAddress[l][n][p]其中参数LineNumber是您想要拷贝的行的地址,参数DestinationAddress代表您想让副本位于该行之后。可选的子命令l、n和p显示拷贝的行。
请输入下面的子命令:
[Address]g/Pattern/t[DestinationAddress][l][n][p]
其中Address是可选参数,在它指定的行的范围中搜索包含了指定模式的行,参数Pattern是您要搜索的文本,而DestinationAddress是可选的参数,指定您想要拷贝的文本行在其之后。可选的子命令l、n和p显示拷贝的行。
如果您省略了参数Address,ed 编辑器就在整个文件中搜索包含模式的行。如果您省略了参数DestinationAddress,拷贝后的文本就被放置到当前行之后。
请输入下面的子命令:
[Address]v/Pattern/t[DestinationAddress][l][n][p]
其中Address是可选参数,在它指定的行的范围中搜索包含了指定模式的行,参数Pattern是文本,而DestinationAddress是可选的参数,指定您想要拷贝的文本行在某行之后。可选的子命令l、n和p显示拷贝的行。
如果您省略了参数Address,ed 编辑器就在整个文件中搜索不包含该模式的行。如果您省略了参数DestinationAddress,拷贝后的文本就被放置到当前行之后。
(.,.)(.,.)d [l] [n] [p] | 子命令d(删除)将指定的行从缓冲区中除去。最后一次删除的行之后的行就成为当前行。如果被删除的行原来位于该缓冲区的结束位置,新的最后一行就成为当前行。
如果您想要显示被删除的行,请输入可选的子命令l(列表)、n(行号)或p(打印)。 |
ed 编辑器提供了几种方式来删除文本。请使用前面的格式来执行下面的编辑任务:
请输入下面的子命令:
d[l][n][p]
请输入下面的子命令:
Addressd[l][n][p]
其中参数Address是您想要删除的行的行号或符号地址,而l、n和p是显示被删除的一行或几行的可选子命令。
请输入下面的子命令:
[Address]g/Pattern/d[l][n][p]
其中Address是可选参数,它指定了您想要搜索的行的行号或符号地址,而参数Pattern是字符串或正则表达式代表了您想要查找的文本。如果您省略了参数Address,ed 编辑器就在整个文件中搜索包含了指定模式的行。可选的子命令l、n和p显示被删除的一行或几行。
请输入下面的子命令:
[Address]v/Pattern/d[l][n][p]
其中Address是可选参数,它指定了您想要搜索的行的行号或符号地址,而参数Pattern是字符串或正则表达式代表了您想要查找的文本。如果您省略了参数Address,ed 编辑器就在整个文件中搜索不包含该模式的行。可选的子命令l、n和p显示被删除的一行或几行。
s/Pattern其中参数Pattern是字符串或者正则表达式,代表您想要删除的文本。
//或
要从行中删除模式的每一个实例,请输入:
//g
g
或
要选择第 4 步未被参数 Pattern 所指示的行,请输入:
v
/Pattern/s
其中参数Pattern是您想要搜索的文本。
要在选中的每一行中删除参数Pattern的第一个实例,请输入:
///
要在选中的每一行中删除参数Pattern的每一个实例,请输入:
///g
要在选中的每一行上删除第一个出现了指定次数的参数Pattern(其中参数Number为整数),请输入:
///Number
要在参数Pattern所选择的每一行中删除参数OtherPattern所指示的第一个字符串(其中参数OtherPattern是您想要搜索的模式),请输入:
/OtherPattern//
要在参数Pattern所选择的每一行中删除参数OtherPattern的每一个实例,请输入:
/OtherPattern//g
要在参数Pattern所选择的每一行中删除第一次出现了指定次数的参数OtherPattern(其中参数Number为整数),请输入:
/OtherPattern//Number
例如,要从某范围的行中删除某个模式的所有实例,请输入:
38,$g/tmp/s/gn
前面的示例在行 38 到最后一行间的所有行(38,$)中搜索 tmp 字符串并在这些行中删除该字符串的每一个实例(/g)。然后它显示文本被删除的行及它们的行号(n)。
要从包含该模式的所有行中删除该模式的所有实例,请输入:
g/rem/s///gl
前面的示例在整个文件中(地址参数被省略)搜索包含(g)字符串 rem 的所有行。它从每一行中删除字符串 rem 的所有实例(///g),然后显示删除文本的行,包括这些行中的非打印字符(l)。
Addresss/Pattern
//或
要从每一行中删除该模式的每一个实例,请输入:
//g
[Address]g/Pattern/s其中 Address是可选参数,它指定了包含了指定模式的行的行号、行号范围或符号地址,而参数 Pattern 是字符串或正则表达式,代表您想要查找和删除的文本。如果您省略了参数 Address,ed 编辑器就在文件的所有行中搜索该模式。
///OR
要从包含该模式的每一行中删除它的每一个实例,请输入:
///g
[Address]g/SearchPattern/s
其中 Address 是可选参数,它指定了包含了指定模式的行的行号、行号范围或符号地址,而参数 SearchPattern 是字符串或正则表达式,代表您想要更改的行中的文本。如果您省略了参数 Address,ed 编辑器就在文件的所有行中搜索该指定模式。
/DeletePattern/
/OR
要从每一行中删除该模式的每一个实例,请输入:
/g
例如,要从包含了不同的指定模式的行中删除模式的第一个实例,请输入:
1,.g/rem/s/tmp//l
前面的示例搜索第一行到当前行(1,.)中所有包含(g)rem 字符串的行。它从这些行的每一行(/)中删除字符串 tmp 的第一个实例,然后显示文本被删除的行,包括这些行中的非打印字符(l)。
[Address]v/SearchPattern/s
其中Address是可选参数,它指定了包含了指定模式的行的行号、行号范围或符号地址,而参数SearchPattern是字符串或正则表达式,代表不在您想要查找并更改的行中的文本。如果您省略了参数Address,ed 编辑器就在文件的所有行中搜索该指定模式。
/DeletePattern/
/OR
要从每一行中删除该模式的每一个实例,请输入:
/g
例如,要从不包含指定模式的行中删除模式的第一个实例,请输入:
1,.v/rem/s/tmp//l
前面的示例搜索第一行到当前行(1,.)中所有不包含(v)rem 字符串的行。它从这些行的每一行中(/)删除字符串 tmp 的第一个实例,然后显示文本被删除的行,包括这些行中的非打印字符(l)。
(.,.)l | 子命令l(列表)以一种视觉上明确的格式将指定的行写到标准输出,并以相应的转义序列写字符\\\、\\a、\\b、\\f、\\r、\\t和\\v。子命令l将打印不出的字符写作一个 3 位数的八进制数,在该字符的每个字节前面加上一个 \ (反斜杠)(最重要的字节在第一位)。
子命令l将长的行换行,您可以通过写 \ (反斜杠) / 换行字符序列来指示换行点。换行发生在第 72 列的位置。$(美元符号)标记每一行的结束。您可以将 l 子命令附加给所有 ed 编辑器子命令,除了 e、E、f、q、Q、r、w 或 ! 子命令。当前的行号被设置为被写的最后一行的地址。 |
(.,.)n | 子命令n(行号)显示指定的行,每行的前面是它自己的行号和一个跳格字符(显示为空白);n将被显示的最后一行设置为当前行。您可以将子命令n附加到除e、f、r或w之外的任何 ed 编辑器子命令之上。例如,子命令dn删除当前行并显示新的当前行和行号。 |
(.,.)(.,.)p | 子命令p(打印)显示指定的行并将被显示的最后一行设置为当前行。您可以将子命令p附加到除e、f、r或w之外的任何 ed 编辑器子命令之上。例如,子命令dp删除当前行并显示新的当前行。 |
(.)= | 如果不提供地址,子命令=(等号)就显示当前行的行号。当前面有 $ 地址的时候,子命令=显示缓冲区内最后一行的行号。子命令=不更改当前行,并且不能附加到子命令g或子命令v之上。 |
当您搜索包含或不包含指定模式的行时,您可以选择某个范围的行号来搜索。您可以用几种不同的方式选择并显示一个 ed 编辑器文件中的一行或一组行。请使用前面的格式来执行下面的编辑任务:
请输入下面的子命令:
Addressp
其中参数Address是您想要显示的行的行号或符号地址。
指定的一行或几行被显示到屏幕上。如果该组行太长而屏幕不能装下,ed 编辑器就从指定的第一行开始,尽量多地显示。
请输入下面的子命令:
Addressl
其中参数Address是您想要显示的行的行号或符号地址。
指定的一行或几行以及它们非打印字符被显示到屏幕上。如果该组行太长而屏幕不能装下,ed 编辑器就从指定的第一行开始,尽量多地显示。
请输入下面的子命令:
Addressn
其中参数Address是您想要显示的行的行号或符号地址。
指定的一行或几行被显示到屏幕上。每一行的行号被显示在该行的旁边。如果该组行太长而屏幕不能装下,ed 编辑器就从指定的第一行开始,尽量多地显示。
请输入下面的子命令:
Addressg/Pattern/p
其中参数Address是行的范围,参数Pattern是您想要搜索的字符串或者正则表达式。
包含了指定模式的一行或几行被显示到屏幕上。如果该组行太长而屏幕不能装下,ed 编辑器就从指定的第一行开始,尽量多地显示。
请输入下面的子命令:
[Address]g/Pattern/l
其中Address是可选参数,它指定了行的范围,参数Pattern是您想要搜索的字符串或正则表达式。如果您省略了参数Address,ed 编辑器就搜索整个文件。
包含了指定模式的一行或几行被显示到屏幕上。非打印字符在屏幕上显现。如果该组行太长而屏幕不能装下,ed 编辑器就从指定的第一行开始,尽量多地显示。
请输入下面的子命令:
[Address]g/Pattern/n
其中Address是可选参数,它指定了行的范围,参数Pattern是您想要搜索的字符串或正则表达式。如果您省略了参数Address,ed 编辑器就搜索整个文件。
包含了指定模式的一行或几行被显示到屏幕上。每一行的行号被显示在该行的旁边。如果该组行太长而屏幕不能装下,ed 编辑器就从指定的第一行开始,尽量多地显示。
请输入下面的子命令:
[Address]v/Pattern/p
其中Address是可选参数,它指定了行的范围,参数Pattern是您想要搜索的字符串或正则表达式。如果您省略了参数Address,ed 编辑器就搜索整个文件。
不包含指定模式的一行或几行被显示到屏幕上。如果该组行太长而屏幕不能装下,ed 编辑器就从指定的第一行开始,尽量多地显示。
请输入下面的子命令:
[Address]v/Pattern/l
其中Address是可选参数,它指定了行的范围,参数Pattern是您想要搜索的字符串或正则表达式。如果您省略了参数Address,ed 编辑器就搜索整个文件。
不包含指定模式的一行或几行被显示到屏幕上,包括非打印字符。如果该组行太长而屏幕不能装下,ed 编辑器就从指定的第一行开始,尽量多地显示。
请输入下面的子命令:
[Address]v/Pattern/n
其中Address是可选参数,它指定了行的范围,参数Pattern是您想要搜索的字符串或正则表达式。如果您省略了参数Address,ed 编辑器就搜索整个文件。
不包含指定模式的一行或几行被显示到屏幕上,还有它们的行号。如果该组行太长而屏幕不能装下,ed 编辑器就从指定的第一行开始,尽量多地显示。
(.,.+1)j [l] [n] [p] | 子命令j(合并)通过除去行与行之间的换行符来合并相邻的行。如果仅给出一个地址,子命令j不进行任何操作。
如果您想要显示合并的行,请输入子命令l(列表)、n(行号)或p(打印)。这些子命令是可选的。 |
ed 编辑器提供了几种方式来合并或分割行。请使用前面的格式来执行下面的编辑任务:
请输入下面的子命令:
j[l][n][p]
请输入下面的子命令:
Addressj[l][n][p]
其中参数Address是将要组成一行的连续行的集合,而l、n和p是显示合并的行的可选子命令。
s/Pattern/Pattern\其中参数Pattern是字符串,您想要从它后面分割该行。
/
Addresss/Pattern/Pattern\其中参数Address是将被分割的行的地址,而参数Pattern是字符串,将从它之后分割该行。
/
(1,$)g/Pattern/SubcommandList [l] [n] [p] | 子命令g(全局)首先给匹配参数Pattern的每一行都加上标记。该模式可以是一个固定的字符串或者正则表达式。然后,针对标记的每一行,该子命令都将该标记的行设置为当前行并运行参数SubcommandList。请在相同的行上输入单个的子命令或一个子命令列表的第一个子命令,并加上子命令g;请在不同的行顺序输入子命令。除最后一行之外,每一行都应该用一个 \ (反斜杠) 结束。
参数 SubcommandList 可能包含子命令 a、i和 c 以及它们的输入。如果 SubcommandList 参数中的最后一个命令通常都是终止输入方式的 .(句点),则 .(句点)是可选的。如果参数 SubcommandList 不存在,则显示当前行。参数 SubcommandList 不能包含子命令g、G、v或V。 如果您想要显示更改,请输入子命令l(列表)、n(行号)或p(打印)。这些子命令是可选的。 注:
|
(1,$)G/Pattern/ [l] [n] [p] | 交互式子命令G(全局)将匹配参数Pattern的每一行都标记上,显示标记过的第一行,将该行设置为当前行,然后等待子命令。模式可以是一个固定的字符串或者正则表达式。
子命令G不接受子命令a、i、c、g、G、v和V。该子命令完成后,子命令G显示下一个标记的行,如此反复。子命令G把换行符当作空子命令。:& (冒号 & 符号) 让子命令 G 再次运行上一个子命令。您可以通过敲 Ctrl+C 来停止子命令G。 如果您想要显示改动,请输入子命令l(列表)、n(行号)或p(打印)。这些子命令是可选的。 |
(1,$)v/Pattern/SubcommandList [l] [n] [p] | 子命令v对不包含参数Pattern的匹配的每一行都运行参数SubcommandList中的子命令。模式可以是一个固定的字符串或者正则表达式。
如果您想要显示更改后的结果,请输入子命令l(列表)、n(行号)或p(打印)。这些子命令是可选的。 注:
|
(1,$)V/Pattern/ [l] [n] [p] | 子命令V将不匹配参数Pattern的每一行标记上,显示标记过的第一行,将该行设置为当前行,然后等待子命令。模式可以是一个固定的字符串或者正则表达式。
如果您想要显示更改,请输入子命令l(列表)、n(行号)或p(打印)。这些子命令是可选的。 注:
子命令V与子命令G是互补的,后者将匹配该模式的行标记上。 |
(.)(.)kx [l] [n] [p] | 子命令k(标记)用参数x指定的名称标记指定的行,该参数必须是小写的 ASCII 字母。然后地址 'x(单引号标记在标记字符之前)寻址该行。子命令k不更改当前行。
如果您想要显示标记过的文本,请输入子命令l(列表)、n(行号)或p(打印)。这些子命令是可选的。 |
请输入下面的子命令:
kLetter[l][n][p]
其中参数Letter是从字母a到z,用作标记,而l、n和p是显示标记过的文本的可选子命令。
请输入下面的子命令:
AddresskLetter[l][n][p]
其中参数Address是您想要标记的行的行号或符号地址,参数Letter是从字母a到z,用作标记。可选的子命令l、n和p显示标记过的文本。
(.,.)(.,.)mA [l] [n] [p] | 子命令m(移动)改变指定的一行或几行的位置。最先被移动的行跟在参数A所指定的行之后。参数 0 将指定的一行或几行移到该文件的开始。参数A所指定的地址不能是将被移动的行之一。子命令m将最后被移动的行设置为当前行。
如果您想要显示删除,请输入子命令l(列表)、n(行号)或p(打印)。这些子命令是可选的。 |
移动一行或一个行的集合将把指定的行从它们最初的位置删除,并将它们放置到一个新的位置。您可以用地址或模式选择移动哪些行。请使用前面的格式来执行下面的编辑任务:
请输入下面的子命令:
mAddress[l][n][p]
其中参数Address是您想要让当前行在其后的行的行号或符号地址,而l、n和p是显示移动的行的可选子命令。
请输入下面的子命令:
LineNumbermDestinationAddress[l][n][p]
其中参数LineNumber是您想要移动的行的地址,参数DestinationAddress是您想要被移动的行放在其后的行。可选的子命令l、n和p显示移动的行。
请输入下面的子命令:
[Address]g/Pattern/m[DestinationAddress][l][n][p]
其中参数Address是可选的参数,在它指定的行中搜索包含指定模式的行,参数Pattern是您正在搜索的文本,而DestinationAddress是可选的参数,代表您想让被移动的行跟随其后的行。可选的子命令l、n和p显示被移动的行。
如果您省略了参数Address,ed 编辑器就在整个文件中搜索包含模式的行。如果您省略了参数DestinationAddress,移动后的文本就被放置到当前行之后。
请输入下面的子命令:
[Address]v/Pattern/m[DestinationAddress][l][n][p]
其中Address是可选参数,在它指定的行的范围中搜索不包含指定模式的行,参数Pattern是文本,而DestinationAddress是可选参数,代表您想让被移动的行跟随其后的行。可选的子命令l、n和p显示被移动的行。
如果您省略了参数Address,ed 编辑器就在整个文件中搜索不包含该模式的行。如果您省略了参数DestinationAddress,移动后的文本就被放置到当前行之后。
您可以以几种方式保存对文件的更改。请使用前面的格式来执行下面的编辑任务:
请输入下面的子命令:
w
当前文件是以它当前的名称保存的,ed 编辑器显示写入的字符数。
请输入下面的子命令:
Addressw
其中参数Address指定了要写的一行或一组行。ed 编辑器显示写入的字符数。
请输入下面的子命令:
w File
其中参数File是要写入的文件的名称。
当前文件被保存到参数File所指定的文件中。ed 编辑器显示写入的字符数。
请输入下面的子命令:
Addressw File
其中参数Address指定了要写的一行或一组行,而参数File指定了要写入的文件。
指定的行被保存到参数File所指定的文件。ed 编辑器显示写入的字符数。
您可以从当前行向前或向后搜索某种模式的文本。该模式可以是由文字字符和特殊字符 ^ (音调符号), $(美元符号), .(句点), [(左括弧)、](右括弧), *(星号), \ (反斜杠), %(百分号)和 & 键组成的字符串或正则表达式。
您可以使用 ed 编辑器来执行下面的文本搜索:
请输入下面的子命令:
/Pattern
其中参数 Pattern 是字符串或正则表达式,它指定了搜索的文本。
光标移动到该模式所指定的文本的第一个字符。
请输入下面的子命令:
?Pattern
其中参数Pattern是字符串或正则表达式,它指定了搜索的文本。
光标移动到该模式所指定的文本的第一个字符。
请输入下面的子命令:
/
光标移动到上一次搜索命令中的模式所指定的最近的文本实例的第一个字符。
请输入下面的子命令:
?
光标移动到上一次搜索命令中的模式所指定的最近的文本实例的第一个字符。
(.,.)(.,.)s/Pattern/Replacement/ [l] [n] [p]
(.,.)(.,.)s/Pattern/Replacement/ng [l] [n] [p] |
子命令s(替换)在指定的每一行中搜索匹配参数Pattern的字符串,并用指定的参数Replacement替换该字符串。模式可以是一个固定的字符串或者正则表达式。如果没有全局子命令 (g) ,子命令 s 就只在指定的每一行上替换第一个匹配字符串。如果有子命令 g,子命令 s 就在指定的每一行上替换出现的每一个匹配字符串。如果子命令 s 没有为该模式找到匹配,它就返回错误消息 ?(问号)。
请输入子命令 l(列表)、n(行号)或 p(打印)来显示替换的文本。这些子命令是可选的。 注:
除空格和换行符之外,任何字符都可以分隔(定界)参数 Pattern 和 Replacement。子命令 s 将最后更改的行设置为当前行。
如果指定了参数 Number(整数),那么在指定的每一行中匹配字符串的第一个数被替换。 参数 Replacement 中所用的字符 & (与) 具有和参数 Pattern 相同的值。例如,子命令 s/are/&n't/ 具有和子命令 s/are/aren't/ 相同的效果,在当前行上把 are 替换为 aren't。 \& (反斜杠,与) 除去了字符 & 在参数 Replacement 中的特殊意义。 子模式是由字符串 \( (反斜杠,左圆括号)和 \) (反斜杠,右圆括号)所封闭的模式的一部分;模式起作用仿佛封闭字符不存在。在参数 Replacement 中, \Number 指的是匹配子模式的字符串。例如,如果当前行中有模式the 的匹配,子命令 s/\(t\)\(h\) \(e\)/t\1\2ose) 就把 the 替换为 those。无论子模式是被嵌套还是位于一个系列中, \Number 都指的是参数 Number 所指定的具体值,即为从定界字符的左边数起的 \) (反斜杠,右圆括号)。 当 %(百分号)被单独用作参数 Replacement 时,它就让子命令 s 重复上一个参数 Replacement。如果 % 是较长的Replacement参数的一部分,或者如果 % 前面有一个 \ (反斜杠),它就不具备这种特殊的意义。 您可以通过将换行符替换到行中来分割行。在参数 Replacement 中。敲 \+Enter 的按键顺序引用是换行符(不显示),并将光标移动到下一行以为该字符串的剩余部分做好准备。换行符不能作为子命令 g 或子命令 v 的列表的一部分而被替换。 |
ed 编辑器提供了几种方式来替换文本。请使用前面的格式来执行下面的编辑任务:
s/OldString/NewString其中参数 OldString 是存在的文本,而参数 NewString 是您想要用来替换的文本。
要在当前行中用参数 NewString 替换参数 OldString 的第一个实例,请输入:
/
要在当前行中用参数 NewString 替换参数 OldPattern 的每一个实例,请输入:
/g
Addresss/OldPattern/NewString其中参数 Address 是您想要替换文本的一行或一组行的地址,参数 OldPattern 是存在的文本,而参数 NewString 是您想要用来替换的文本。
要在每一行中用参数 NewString 替换参数 OldPattern 的第一个实例,请输入:
/NewString/
要在每一行中用参数 NewString 替换参数 OldPattern 的每一个实例,请输入:
/NewString/g
要在指定的每一行上用参数 NewString 替换参数 NumberOldPattern 的第一个实例,请输入:
/NewString/Number
Addressg/Pattern/s//NewString其中参数Address是一组行的地址,您想要在这组行中搜索参数Pattern所指定的模式,而参数NewString是您想要用来替换参数Pattern的文本。
要在每一行中用参数NewString替换参数Pattern的第一个实例,请输入:
/
要在每一行中用参数NewString替换参数Pattern的每一个实例,请输入:
/g
Addressg/Pattern/s/OldString/NewString其中参数Address是一组行的地址,您想要在这组行中搜索参数Pattern所指定的模式,参数OldString是您想要替换掉的文本,而参数NewString是您想要用来替换参数OldString的文本。
要在包含了参数Pattern的每一行中用参数NewString替换参数OldString的第一个实例,请输入:
/
要在包含了参数Pattern的每一行中用参数NewString替换参数OldString的每一个实例,请输入:
/g
Addressv/Pattern/s/OldString/NewString
其中参数Address是一组行的地址,您想要在这组行中搜索参数Pattern所指定的模式,参数OldString是您想要替换掉的文本,而参数NewString是您想要用来替换参数OldString的文本。
要在不包含参数Pattern的每一行中用参数NewString替换参数OldString的第一个实例,请输入:
/
要在不包含参数Pattern的每一行中用参数NewString替换参数OldString的每一个实例,请输入:
/g
u [l] [n] [p] | 子命令u(撤销)将缓冲区恢复到它最近一次被 ed 编辑器的子命令修改之前的状态。子命令u不能撤销子命令e、f和w。
如果您想要显示更改,请输入子命令l(列表)、n(行号)或p(打印)。这些子命令是可选的。 |
请输入下面的子命令:
u[l][n][p]
其中l、n和p是显示更改的可选子命令。在最后一次保存之后的对该文本执行的所有添加、更改、移动、拷贝或删除的编辑功能都被撤销。
您可以使用 ed 编辑器的子命令管理文件以执行下面的任务:
请输入下面的子命令:
r File
其中参数File是要被插入的文件名。
ed 编辑器将参数File指定的文件读入到当前文件的当前行之后,并显示读入到当前文件中的字符数。
请输入下面的子命令:
Addressr File
其中参数Address指定了您想要放置其后的行,而参数File是将要被插入的文件名称。
ed 编辑器将参数File指定的文件读入到当前文件的指定行之后,并显示读入到当前文件中的字符数。
f [File] | 子命令f(文件名)将缺省文件名(存储下来的最近一次使用过的文件名)更改为参数File所指定的文件名。如果没有指定参数File,子命令f显示缺省文件名。(子命令e存储缺省文件名。) |
请输入下面的子命令:
f
ed 编辑器显示编辑缓冲区中的文件名称。
请输入下面的子命令:
f File
其中参数File是该编辑缓冲区内的文件的新名称。
编辑缓冲区内的文件被重新命名。
e File | 子命令e(编辑)首先从该缓冲区删除任何内容,将该缓冲区的最后一行设置为当前行,并显示读入该缓冲区的字符数。如果自缓冲区的内容被保存(使用子命令 w)以来该缓冲区已被更改,ed 编辑器会在它清除该缓冲区之前显示一个 ?(问号)。
子命令e将参数File存储为要使用的缺省文件名,如果必要的话,再随后使用子命令e、r或w。(要更改缺省文件名的名称,请使用子命令f。) 当 ! (感叹号)替换了参数File的时候,子命令e就认为该行剩下的部分是操作系统外壳命令,并读入该命令的输出。子命令e不将外壳命令的名称存储为缺省文件名。 |
E File | 子命令E(编辑)的作用和子命令e相似,有一点例外;子命令E不检查最近一次子命令w之后对该缓冲区做出的更改。在重新编辑文件之前进行的所有更改都会丢失。 |
您可以使用子命令 e 或 E 执行下面的任务:
请输入下面的子命令:
E
ed 编辑器显示该文件中的字符数。在重新编辑文件之前进行的所有更改都会丢失。
请输入下面的子命令:
e
ed 编辑器显示该文件中的字符数。
请输入下面的子命令:
e File
其中参数File是您想要编辑的新的或存在的文件的名称。
对于存在的文件,ed 编辑器显示该文件中的字符数。对于新文件,ed 编辑器显示一个 ?(问号)和文件名。
请输入下面的子命令:
E File
其中参数File是您想要编辑的新的或存在的文件的名称。
对于存在的文件,ed 编辑器显示该文件中的字符数。对于新文件,ed 编辑器显示一个 ?(问号)和文件名。
您可以使用 edit 编辑器子命令执行下面的任务:
P | 子命令 P(提示)打开或关闭用 *(星号)代表的 ed 编辑器提示符字符串。初始时,子命令 P 是关闭的。 |
请输入下面的子命令:
P
ed 编辑器的提示符 *(星号)是否显示取决于它先前的设置。
! 命令 | ! 子命令允许您运行操作系统命令,而不用离开 ed 编辑器。在 ed 编辑器的某一子命令行上跟在 ! 子命令后的所有内容将解释成操作系统命令。在该命令字符串的文本中,ed 编辑器将未转义的 %(百分号)替换为当前文件名,如果存在的话。
可以通过在 ! ed 编辑器子命令后输入 !(感叹号)来重复先前的操作系统命令。如果操作系统的命令解释器(命令 sh)扩展了命令字符串,则 ed 编辑器回送扩展的行。! 子命令不更改当前行。 |
您可以使用 ! 子命令执行以下操作:
请输入下面的子命令:
!Command
其中参数Command指定一条通常在提示符处输入的操作系统命令。
该命令运行并显示其输出。命令完成后,编辑器显示一个 !(感叹号)。
请输入下面的子命令:
!
之前运行过的操作系统命令运行并显示其输出。命令完成后,编辑器显示一个 !(感叹号)。
!sh
q | 子命令q(退出)检查该缓冲区是否在最近一次执行的更改之后已被保存到文件中,然后退出 ed 编辑器。如果该缓冲区没有保存到文件中,子命令 q 显示 ?(问号)消息。请再次输入子命令q以强行退出 ed 编辑器。对当前文件所做的更改丢失。 |
Q | 子命令Q(退出)退出 ed 编辑器而不检查自从该缓冲区被保存到文件中以来是否做出了更改。自从最后一次保存以后对该缓冲区做出的任何更改都丢失。 |
q
要在退出之前保存更改,请输入:
w
然后敲 Enter 键。
要退出而不保存更改,请输入:
q
h | h(帮助)子命令为显示的最新 ? 诊断或错误消息提供了简要的帮助消息。 |
H | 子命令H(帮助)让 ed 编辑器为所有后来发生的 ? 诊断消息显示帮助消息。子命令H也解释前面的 ? ,如果有的话。子命令H交替地打开或关闭这种方式;它最初是关闭的。 |
请输入下面的子命令:
H
是否为 ed 编辑器响应的 ? 显示帮助消息取决于前面的设置。
请输入下面的子命令:
h
为 ed 编辑器最近一次响应的 ? 显示一条帮助消息。
在标准表达式Patterns中,范围表达式匹配所有那些属于当前语言环境的整理顺序的两个字符之间的字符集合。范围表达式的语法如下:
[character-character]
第一个字符在整理序列中必须低于或等于第二个字符。例如[a-c] 匹配 En_US 语言环境中 a 、 b 或 c 中的任何一个。
范围表达式一般被用来匹配一个字符类。例如[0-9] 被用来指代所有的数字,而 [a-z A-Z] 被用来指代所有字母。当根据当前的语言环境的整理序列来解释范围时,这种格式可能会产生不可预料的结果。
请用 [ ](括弧)内的字符类表达式来匹配字符,而不采用前面的格式。系统根据当前语言环境中的字符类定义解释这种表达式的类型。但是,您不能在范围表达式中使用字符类表达式。
字符类表达式的语法如下:
[:CharacterClass:]
也就是一个左括弧、一个冒号、字符类的名称、另一个冒号,然后是右括弧。
所有的语言环境中都支持下面的字符类:
括弧是字符类定义的一部分。要匹配任意大写 ASCII 字母或 ASCII 数字,请使用下面的正则表达式:
[[:upper:] [:digit:]]
请不要使用表达式[A-Z0-9]。
一种语言环境可能支持其它的字符类。
换行符是字符类[:space:]的一部分,但是将不被该字符类所匹配。换行符只能用特殊搜索字符 $(美元符号)和 ^ (脱字符) 匹配。
命令ed和red返回下面的出口值:
0 | 成功结束。 |
>0 | 发生错误。 |
命令edit、命令ex、命令grep、命令rsh、命令sed、命令sh、命令stty、命令vi或命令vedit、命令view。