http://hi.baidu.com/linuxtrip/item/4b52205f5a5da74c4fff2005
一、什么是ed
1、ed是又称为" red " ,它是一种文本编辑器,是对输入文件的内容按行进行编辑,所以它是行编辑器
2、ed的工作环境:不仅可以在bash中使用ed指令,也可以在脚本文件中使用ed指令(通常ed指令用于脚本中)
3、ed的工作流程:它将整个文件的内容读入自己的缓冲区,对该副本执行指定的操作,并可选地将缓冲区写到磁盘
二、ed指令语法简介
1、ed指令该如何使用呢?ed指令有自己的Format,如下:
[address] [command] [suffix]
[地址] [命令] [后缀]
(1)address:指定要处理ed缓冲区的一行或多行(缺省为当前行,即:缓冲区中内容的最后一行),并且可以通过多种方式进行指定
(2)command :它是以 " 单字符 " 方式存在,表示是要对ed缓冲区中所指定的行执行操作,命令中可以使用匹配模式,而匹配模式(pattern)中可以使用BERs(基本正则表达式)
(3)suffix:后缀
注意两点:
(1)对于脚本中的特别单命令行程序,可使用 echo 将一组命令和文本管道传输给ed指令,从而以非交互式的方式使用它
(2)也可以把Format写到一个文件中,每一行一个Format,然后使用 “<" 符号将文件中的所有Format导出给 ed指令,让ed指令执行这些Format
2、详细介绍ed指令的Format
ed指令的Format有三段:[address]、[command]、[suffix]
1)[address]:该段是地址字段,作用是用来告诉ed指令要处理缓冲区的哪些行,即:对行询址
.
对缓冲区中的当前行寻址(缺省地址)
0
对缓冲区中的开头(第一行之前)寻址
1
对缓冲区中的第一行寻址
n
对缓冲区中的第n行寻址
$
对缓冲区中的最后一行寻址
-n
对缓冲区中的当前行之前的第n行寻址,如果没有n,则减号对紧跟在当前行之前的行寻址
+n
对缓冲区中的当前行之后的第n行寻址,如果没有n,则加号对紧跟在当前行之后的行寻址
,
对第一至最后一行寻址,包括第一行和最后一行
注意:与1,$
相同;与%相同
;
对当前行至最后一行寻址
/pattern/
从当前行开始向下进行检查,对下一个包含与 pattern 匹配的文本的行寻址
(注意:pattern可以使用BREs)
?pattern?
从当前行开始向上进行检查,对上一个包含与 pattern 匹配的文本的行寻址
(注意:pattern可以使用BREs)
2)[command]:该段是命令字段,作用是用来告诉ed指令要执行哪些命令
a
该命令在指定的地址之后追加文本
c
该命令将指定的地址更改为给定的文本
d
该命令删除指定地址处的行
i
该命令在指定的地址之前插入文本
j
该命令将指定的多行进行合并成一行
p
该命令是输出所指定地址的行的内容
n
该命令是输出所指定地址的行的内容,同时为这些内容的每行开头带上编号(从1开始)
m
该命令将移动指定的地址处的行到另一个指定的地址处
(例如:$,将第一行移动到最后一行的下一行)
t
该命令将复制指定的地址处的行,将粘贴到另一个指定的地址处
(例如:2t$,将第二行进行复制,然后粘贴到最后一行的下一行)
=
该命令显示指定地址的行的编号
(例如:.=则显示当前行的编号;$=则显示最后一行的编号)
q
该命令在将缓冲区保存到磁盘后终止程序并退出
r file
该命令将读取filespec 的内容并将其插入指定的地址之后
s/pattern/replacement
该命令将匹配 pattern 的文本替换为指定地址中的 replacement 文本
w file
该命令将指定的地址写到file文件;如果没有给出address,则此命令缺省使用整个缓冲区;如果没有给出file文件;则此命令表示写到本文件
e file
该命令将文件file中的内容被读入ed缓冲区(注意:原来ed缓冲区的内容将被覆盖)
e !指令
该命令将执行一条指令(例如:ls /root)的输出结果被读入ed缓冲区
(注意:原来ed缓冲区的内容也被覆盖)
g/pattern/command-list
该命令对匹配pattern的所有行执行command-list命令列表中的命令(g:表示全局命令)
3)[suffix]:即“ 后缀 “,该段是用来加强命令的执行,主要的后缀如下
空
改变一行的第一个出现
n
它是一个标志,即:改变一行上的每个出现,而不仅仅是一行的第一个出现,改变时需要用户确认
g
它是一个标志,即:改变一行上的每个出现,而不仅仅一行的第一个出现,改变时不用用户确认
注意:'g'的含义不同。开始处的'g'是全局命令,意味着对所有与地址匹配的行进行改变。结尾处的'g'是一个标志,意味着改变一行上的每个出现,不只是第一个
三、实例讲解
1、bash命令解析器中:ed指令的交互式操作方式
注意:图中 "$a":表示在ed缓存内容的最后面追加文字 “ This is eleven OK “,接下来一行的“ . "表示输入结束,再接下来的wq表示保存退出ed
2、bash命令解析器中:ed指令的非交互式操作方式(使用echo指令与ed指令的混合)
1)在文件file内容的开头前增加一行,内容为:“How are you today?“
注意:上图中的"(command1;command2;...)"作用:将括号中的命令放在新的shell中运行,而不是放在当前登录的shell中运行!
2)在匹配的行的前一行插入一行,内容为:i like computer
方法一:使用echo指令与ed指令
方法二:使用" << "操作符
3)删除匹配的行到最后一行之间的内容
注意:使用第二种方法时,要在" $ "符号前加上backslash,屏蔽它的引申义(bash对其的解析)
4)删除文件中各行的尾随空格
5)删除文件中含有 "标点符号" 或者 "控制符号" 的行
注意:g命令:它是一个全局命令,全局命令会使匹配正则表达式的所有行成为特定命令的对象
6)将文件中所有匹配正则表达式的行进行某个字符串的替换
注意:开始处的'g'是全局命令,意味着对所有与地址匹配的行进行改变。结尾处的'g'是一个标志,意味着改变一行上的每个出现,不只是第一个
7)区分g命令与g标志
(1)不使用g命令,也不使用g标志
(2)不使用g命令,但使用g标志
(3)使用g命令,但不使用g标志
(1)使用g命令,也使用g标志
8)显示文件中所有匹配到的行
3、ed脚本化操作
方法:将命令写入一个文件(例如:script),一行写一个命令(命令之间最好不要有空行),最后使用 "<" 重定向给ed指令执行这些命令