ed命令是单行纯文本编辑器,它有命令模式(command mode)和输入模式(input mode)两种工作模式。ed命令支持多个内置命令,常见内置命令如下:
A:切换到输入模式,在文件的最后一行之后输入新的内容;
C:切换到输入模式,用输入的内容替换掉最后一行的内容;
i:切换到输入模式,在当前行之前加入一个新的空行来输入内容;
d:用于删除最后一行文本内容;
n:用于显示最后一行的行号和内容;
w:<文件名>:一给定的文件名保存当前正在编辑的文件;
q:退出ed编辑器。
语法
ed(选项)(参数)
选项
-G或——traditional:提供兼容的功能;
-p<字符串>:指定ed在command mode的提示字符;
-s,-,--quiet或——silent:不执行开启文件时的检查功能;
--help:显示帮助;
--version:显示版本信息。
-
ed 命令简介:
-
-
在 unix/linux 平台下,首先要学习的就是文本编辑,而 ed 编辑器是 unix/linux 操作系统下最简单、最典型
-
的文本编辑器,因此,学习 ed 编辑器能够帮助你很好的理解一般的文本操作,而且还可以为你以后学习 unix/linux
-
下的一些常用命令(如 grep,sed,...)打下基础。
-
-
ed 编辑器是以行为单位对文本进行操作的编辑器,也就是说一次仅能编辑一行,非以全屏的方式来操作,而不像 vi/vim
-
那样是以整个屏幕框架为单位对文本进行编辑。ed 简单、易用,也正是由于其小巧玲珑,许多文本操作者现在仍然偏爱它,
-
使用它。
-
-
ed 编辑器可以用于创建、修改、显示文本文件。当 ed 打开一文本文件时,将复制文件的内容到 ed 命令的缓存中, 在
-
ed 中的所有命令操作只作用于缓存中的内容,而不会对源文件有任何影响,除非对源文件进行 w(写) 操作。 ed 有命令模式
-
和输入模式两种状态,类似于 vi/vim 的两种模式,ed 在命令模式下输入的是命令,这些命令用来指定对编辑文本的操作;
-
ed 在输入模式下输入的是文本,这些文本将依照命令模式下输入的命令被添加或替换到文本中。当第一次被调用时,ed 默
-
认进入命令模式,当输入 a、c 或 i 命令后即进入输入模式,在输入模式下,单行输入 '.' 然后回车,则回到命令模式。
-
-
-
ed 调用:
-
-
ed [-GVhl] [-p string] [file]
-
-
注解:
-
file 指定将要编辑的文件(如果文件名以叹号开头 '!file',应用反斜杠引用叹号 '\!file',否则,ed 将视 file
-
命令的输出为编辑内容。)
-
-G 兼容模式
-
-V 输出 ed 版本信息
-
-h 显示 ed 帮助信息
-
-l 强制退出状态为 0(即使操作中出现错误)
-
-p string 指定命令模式下的提示符
-
-
-
ed 命令格式为:
-
-
[address [,address]]command[parameters]
-
-
地址(address,[,address]) 是用来指定命令(command)的作用范围的。如果没给出地址,则为默认地址。ed 读入文件后,当前
-
行默认为文件最后一行,如果文件为空,则当前行号设置为 0。
-
-
命令(command) 会根据指定的地址(或默认地址)对编辑文本进行操作。当输入一非法命令,ed 将会显示一问号 '?' 来提示
-
输入命令错误。
-
-
-
ed 地址:
-
-
地址由下面基本的元素构成,其后也可跟加 '+'、 '-'、 ' ' 和数字来表示自己所需要的地址。
-
-
. 当前行
-
-
$ 文本最后一行
-
-
n 文本第 n 行( n 为数字,下同;m 亦是 )
-
-
-n 从文本当前行数起,向前第 n 行
-
-
+n 从文本当前行数起,向后第 n 行
-
-
- 相当于 -1 行地址
-
-
+ 相当于 + 1 行地址
-
-
m,n 文本的第 m 到 n 行
-
-
, 文本的所有行
-
-
; 文本当前行到最后一行
-
-
/reg/ 从文本当前行数起,下一个匹配 reg 的行
-
-
?reg? 从文本当前行数起,上一个匹配 reg 的行
-
-
'x 由 k 命令标记的行( x 为一小写字母 )
-
-
-
正则表达式如下:(只涉及 ed 所支持的正则表达式)
-
-
. 匹配任何单个字符。
-
-
[char-class] 匹配任何一个在 char-class 里的单个字符。如果中间出现 '- ' ,则意为其左边的字符和其右边的
-
字符之间的所有字符。例如,[abc] 匹配 a 或 b 或 c;[a-z] 匹配任意一个小写字母(a、b、c、
-
...、z),[0-9] 匹配任意一个数字(0、1、2、...、9)。
-
char-class 也可以为一些字符集。如下:
-
[:alpha:] 相当于 [a-zA-Z]
-
[:lower:] 相当于 [a-z]
-
[:upper:] 相当于 [A-Z]
-
[:digit:] 相当于 [0-9]
-
[:alnum:] 相当于 [a-zA-Z0-9]
-
[:blank:] 匹配 ' '(空格)、 '\t '(制表符)
-
[:space:] 匹配 ' '(空格)、'\t '(制表符)、'\n '(新行)、'\ f'()、'\v '(垂直制表符)、'\ r'(回车符)
-
[:cntrl:] 匹配控制字符。在 ASCII 码中,这些控制字符是从八进制数字 000 到 037, 和 177 (DEL)
-
[:print:] 匹配 相当于 [:alnum:]、[:punct:] 和 空格
-
[:graph:] 匹配 相当于 [:alnum:] 、 [:punct:]
-
[:punct:] 匹配 `! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~ ' 等标点符号
-
[:xdigit:] 匹配十六进制字符 ' 0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f'
-
-
[^char-class] 匹配 [char-class] 的补集,即匹配任意一个不在 char-class 里的单个字符
-
-
* 匹配前面的子表达式零次或多次。例如,'ab* ' 能匹配 "a" 以及 "abb"。 * 等价于'\{ 0,\} '
-
-
\+ 匹配前面的子表达式一次或多次。例如,'ab\+ ' 能匹配 "ab" 以及 "abb",但不能匹配 "a"。\+ 等
-
价于 \{1,\}
-
-
\? 匹配前面的子表达式零次或一次。例如,"word(s)\?" 可以匹配 "word" 或 "words" 。\? 等价于
-
\{0,1\}
-
-
\{n,m\} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。 "a{1,3}" 将匹配 "baaaaab"
-
中的前三个 a。'a{ 0, 1} ' 等价于 'a\? '。请注意在逗号和两个数之间不能有空格
-
-
\{n,\} n 是一个非负整数。至少匹配n 次。例如,'a\{ 2,\} ' 不能匹配 "abc" 中的 'a ',但能匹配
-
"baaaaab"中的所有 a。'a\{ 1,\} ' 等价于 'a\+ '。'a\{ 0,\} ' 则等价于 'a* '
-
-
\{n\} n 是一个非负整数。匹配确定的 n 次。例如,'a\{ 2\} ' 不能匹配 "bab" 中的 'a ',但是能匹配
-
"baab"中的两个 a
-
-
^ 匹配输入字符串的开始位置
-
-
$ 匹配输入字符串的结束位置
-
-
\< 匹配一个单词的前边界。例如,'\<el ' 匹配 "element",但不能匹配 "help"
-
-
\> 匹配一个单词的后边界。例如,'ly\> ' 匹配 "lovely",但不匹配 "lying"
-
-
\b 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\ b' 可以匹配"never" 中的 'e r',
-
但不能匹配"verb" 中的 'e r'
-
-
\B 匹配非单词边界。'er\B ' 能匹配 "verb" 中的 'e r',但不能匹配 "never" 中的 'e r'
-
-
\w 匹配任何非单词字符。等价于 '[^A-Za-z0 -9_] '
-
-
\W 匹配任何非单词字符。等价于 '[^A-Za-z0 -9_] '
-
-
\` 匹配一个句子的边界
-
-
\(\) 定义向后引用。'\n '(n为一正整数)代表第 n 个括号中匹配的字符串
-
-
-
ed 命令:
-
ed 命令都是单个字符,其中一些命令有一些选项。如果一命令超过一行,应使 '\ ' 结束每一行。
-
命令如下:(括号内为默认地址)
-
-
(.)a 切换到输入模式,将新输入的文本追加到指定行的后面,当前行被设为输入文本的最后一行
-
-
(.)i 切换到输入模式,将新输入的文本插入到指定行的前面,当前行被设为输入文本的最后一行
-
-
(.,.)c 切换到输入模式,将新输入的文本替换成指定行,当前行被设为输入文本的最后一行
-
-
(.,.)d 删除指定行,如果被删除的文本后还有文本行,则当前行被设为该行,否则设为被删除的文本的
-
上一行
-
-
(.+1) 无命令时,默认 p 命令,但打印下一行内容,当前行被设为打印行
-
-
(.+1)zn 一次跳动 n 行,如果未指出 n ,默认当前终端屏幕大小,当前行被设为最后被打印的行
-
-
(.,.)p 打印指定行,当前行被设为打印行的最后一行
-
-
P ed 命令模式下提示符开关命令,默认提示符为 '* '
-
-
(.,.)l 在每行最后加一 '$ ' 符号指定结尾,并打印输出
-
-
(.,.)n 打印指定行号和内容,行号与行内容用制表符分割,当前行被设为打印行的最后一行
-
-
($)= 打印指定行行号
-
-
(.,.)# 注释行,将被忽略
-
-
(.)k char 用一小写字母标记指定行
-
-
(.,.)s/reg/replacement/
-
(.,.)s/reg/replacement/g
-
(.,.)s/reg/replacement/n
-
替换指定行命令
-
-
(.,.)s 重复上一次替换命令,当前行被设为最后一个被改变的行
-
-
(1,$)g/reg/cmd-list 所有匹配 '/reg/ ' 的行执行 cmd-list 命令,在命令执行前,当前行被设为匹配行。当所有匹配
-
行执行完命令后,当前行被设定为最后一个匹配行。cmd-list 中每一行只能有一个命令,但有多
-
个命令时,应以 '\ ' 结束每一行
-
-
(1,$)G/reg/ 与 g/reg/cmd-list 相似,但匹配的每一行所执行的命令由用户各个定义。
-
-
(1,$)v/reg/cmd-list 与 g/reg/cmd-list 相反,指不匹配行
-
-
(1,$)V/reg/ 与 G/reg/ 相反,指不匹配行
-
-
(.,.+1)j 合并指定行内容,当前行被设为合并行
-
-
(.,.)m(.) 移动左边源指定行到右边目的指定行后,当前行被设为移动行的最后一行
-
-
(.,.)t(.) 复制左边源指定行到右边目的指定行后,当前行被设为复制行的最后一行
-
-
(.,.)y 复制指定行到缓存,当前行不改变
-
-
(.)x 复制缓存内容到指定行后,当前行被设为复制行的最后一行
-
-
u 撤销上一次命令,当前地址被设为上一次地址
-
-
h 打印最后一个错误说明
-
-
H 错误说明开关,默认不输出
-
-
e file 编辑文件并设定文件名
-
-
E file 强制编辑文件,同 e file,但丢失以前的修改,不做警告
-
-
!cmd 执行 shell 命令 cmd
-
-
e !cmd 先将ed 缓冲区清除,替换 cmd 命令的输出
-
-
f file 设置文件名,如果每给出 file 参数,则打印文件名
-
-
($)r file 把指定文件内容追加到指定行后,当前行被设为追加文本的最后一行
-
-
($)r !cmd 把命令的输出追加到指定行后,当前行被设为追加文本的最后一行
-
-
(1,$)w file 保存指定文本内容到指定文件(覆盖保存)
-
-
(1,$)W file 保存指定文本内容到指定文件(追加保存),当前行不改变
-
-
(1,$)w !cmd 输出指定文本内容到 cmd 的标准输入,当前行不改变
-
-
(1,$)wq flie 保存指定文本内容到指定文件(覆盖保存),并退出编辑器
-
-
q 退出 ed 编辑器,退出前若所作的修改没保存,发出警告
-
-
Q 强制退出 ed 编辑器,同 q 命令,但退出前若所作的修改没保存,不警告
-
-
P ed 命令提示符显示开关。 '* ' 为 ed 默认提示符,利用 ed 命令 -p 选项,其可被更改为任意字符
-
-
更为详细之处请参阅 man info 手册
-
实例
以下是一个 Linux ed 完整实例解析:
$ ed <- 激活 ed 命令
a <- 告诉 ed 我要编辑新文件
My name is Titan. <- 输入第一行内容
And I love Perl very much. <- 输入第二行内容
. <- 返回 ed 的命令行状态
i <- 告诉 ed 我要在最后一行之前插入内容
I am 24. <- 将“I am 24.”插入“My name is Titan.”和“And I love Perl very much.”之间
. <- 返回 ed 的命令行状态
c <- 告诉 ed 我要替换最后一行输入内容
I am 24 years old. <- 将“I am 24.”替换成“I am 24 years old.”(注意:这里替换的是最后输的内容)
. <- 返回 ed 的命令行状态
w readme.text <- 将文件命名为“readme.text”并保存(注意:如果是编辑已经存在的文件,只需要敲入 w 即可)
q <- 完全退出 ed 编辑器
<- 激活 ed 命令
a <- 告诉 ed 我要编辑新文件
My name is Titan. <- 输入第一行内容
And I love Perl very much. <- 输入第二行内容
. <- 返回 ed 的命令行状态
i <- 告诉 ed 我要在最后一行之前插入内容
I am 24. <- 将“I am 24.”插入“My name is Titan.”和“And I love Perl very much.”之间
. <- 返回 ed 的命令行状态
c <- 告诉 ed 我要替换最后一行输入内容
I am 24 years old. <- 将“I am 24.”替换成“I am 24 years old.”(注意:这里替换的是最后输的内容)
. <- 返回 ed 的命令行状态
w readme.text <- 将文件命名为“readme.text”并保存(注意:如果是编辑已经存在的文件,只需要敲入 w 即可)
q <- 完全退出 ed 编辑器
这是文件的内容是:
$ cat readme.text
My name is Titan.
I am 24 years old.
And I love Perl vrey much.
.text
My name is Titan.
I am 24 years old.
And I love Perl vrey much.