ed
是一个面向行的文本编辑器。ed
命令还有一个严格的 red
命令,red
命令只能编辑当前目录中的文件,并且不能够执行shell命令。
当使用 ed
命令明确指定一个文件时,文件的一份拷贝被读入编辑器的缓存,所有的编辑都是保存在缓存中,而不是直接在文件中修改。如果退出 ed
却没有显示的使用 w
命令来保存修改的话,所有的修改内容都会丢失。
编辑的内容可以通过两种不同的方式:command
和 input
两种模式。使用第一种命令模式时,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
的行。脚本张使用程序语言的优点是提供了控制编程的语句,包括表达式,条件判断,循环等等结构。