ed 是一个面向行的文本编辑器。ed 命令还有一个严格的 red 命令,red 命令只能编辑当前目录中的文件,并且不能够执行shell命令。

当使用 ed 命令明确指定一个文件时,文件的一份拷贝被读入编辑器的缓存,所有的编辑都是保存在缓存中,而不是直接在文件中修改。如果退出 ed 却没有显示的使用 w 命令来保存修改的话,所有的修改内容都会丢失。

编辑的内容可以通过两种不同的方式:commandinput 两种模式。使用第一种命令模式时,ed 命令通过从标准输入读取命令并将修改执行在编辑器缓存中。一个典型的命令

,s/old/new/g

这一行命令会将文本中所有的 old 字符串替换为 new,这和vim中有些相似。

当使用命令输入比如,a(append), i(insert), c(change) 时,ed 编辑器会进入 input 模式,这意味着给文件添加内容。在这个模式中所有命令都不再支持,相反的,所有的输入都会被写到缓冲中。input 模式将在输入 . 时自动结束并退出。

ed 编辑器的命令针对的是整行,或者数行,比如,d 命令意味着删除行,m 命令意味着移动行。如果要修改某一行中的内容,唯一的方法就是使用替换,就和上面的例子中类似。例子中的 s 命令也是针对的整行。

通常来说,ed 编辑器包含0或者多行行序号,通常后面跟随着命令及参数,他的基本结构如下:

[address [,address]] command [parameters]

address 通常包含一行或者多行

Line Address

可以使用下面的方式来表示行序号,以下所有的行序号都是 buffer 缓冲中行序号:

Tag Description
. buffer 中 当前行
$ 最后一行
n 第 n 行,行的范围是 [0,$]
- or ^ 前一行
-n or ^n 前 n 行
+ or +n 后一行及后n行
, or % 全部行,等同于 1,$
; 当前行到最后一行 .,$
/re/ 下一个包含正则 re 的行
?re? 上一个包含正则 re 的行

Commands

所有的 ed 命令都是单个字符,一些需要其他额外的参数。如果命令跨越了多行,每一行都需要 \ 来结尾。p(print),l(list) 或者 n(enumerate) 打印。如果输入了 ed 不认识的命令,ed 会打印一个 ? 作为错误消息。

Command Description
(.)a 添加到行
(.,.)c 改变行
(.,.)d 删除行
(.)i 添加到行首

还有很多命令可以参考下面的链接。

通常情况下,输入数字开始的行号,可以直接跳转到该行。

脚本

ed 的一个更有趣的特征是脚本化编辑工作的能力,将编辑命令放到独立的文件中并将它们作为行编辑器的输入:

ed filename < ed_script

这个特征使得 ed 成为了可编程的编辑器,也就是说,可以脚本化任何手动执行的操作。

sed 是作为特殊目的的编辑器而创建,专门执行脚本,与 ed 不同,不能交互使用。 sed 与 ed 的主要区别在于它是面向字符流的。默认情况下 sed 的所有输入都会经过处理并且转为标准输出。输入文件本身并不发生改变。如果想要改变输入文件,一般使用 shell 的重定向。ed 不是面向字符流的,并且文件本身会发生改变,ed 脚本必须包含保存文件并且退出编辑器,不能输出到屏幕。

awk 是作为可编程的编辑器而开发的,同 sed 一样,面向字符流,并且解释编辑命令的脚本。awk 与 sed 不同的是它废弃了行编辑器的命令集,提供了仿效 C 语言的程序设计语言,例如使用 print 语句代替了p 命令,但延续了 寻址的概念

/regular/ { print }

用来打印匹配 regular 的行。脚本张使用程序语言的优点是提供了控制编程的语句,包括表达式,条件判断,循环等等结构。

reference