**ed**（）是用于Unix和类Unix操作系统的行编辑器。它是Unix操作系统在1969年8月开发出来的最初部分。它仍旧是POSIX和Open Group的基于Unix的操作系统标准的一部分，与更加完备的全屏幕编辑器vi并列。

历史和影响
-----

ed文本编辑器是Unix操作系统最初的三个要件之一：汇编器、编辑器和shell，它们是肯·汤普逊在1969年8月于AT&T贝尔实验室在PDP-7上开发的。ed的很多特征来自qed（英语：）文本编辑器，它是汤普逊的母校加州大学伯克利分校开发的 。汤普逊非常熟悉qed，曾经在CTSS和Multics系统上重新实现过它。汤普逊版本的qed曾因首先实现了正则表达式而著名。正则表达式也实现于ed中，尽管相比qed中的这里实现的要相当不具一般性。

丹尼斯·里奇生产了后来道格拉斯·麥克羅伊所描述的"终极"ed，ed的各方面转而影响了ex，它依次又产生了vi。非交互式Unix命令grep受到qed和后来的ed常见特定用法的启发，它们的命令g/re/p含义是全局查找正则表达式re并打印包含它的行。Unix流式编辑器sed实现了未被Unix上的ed所支持的qed（英语：）的很多脚本特征。

特征
--

ed的特征包括：

* 在所有Unix系统上必然可获得，在符合单一UNIX规范的系统上是强制的。
* 模态编辑器，支持命令模式、文本模式和查看模式。
* 支持正则表达式。
* 通过从标准输入获取命令而达成的强力自动化。

著称于它的简洁性，ed几乎不给予视觉反馈，故而曾被Peter H. Salus（英语：）称为"曾有过的最仇视用户的编辑器"，即使是比较于同时代的（因复杂而声名狼藉的）TECO（英语：）。例如，在有错误的情况，或它想要确认用户希望不保存退出的时候，ed产生的消息就是"?"。它不报告当前文件名或行号，甚至不显示变更文本的结果，除非发出要求。更老版本（大约1981年）在发起退出命令而用户没有保存变更的时候甚至不提示确认。这种简洁性对Unix的早期版本是适当的，那时控制台是电传打字机，调制解调器很慢，而内存是珍贵的。计算机技术进步使得这些限制解除了，有更多视觉反馈的编辑器成为常规。

在当前实践中，ed极少交互式使用，但却在一些shell脚本中有所使用。对于交互式使用，ed于1980年代被sam（英语：）、vi和Emacs编辑器取代。ed事实上可以在所有可获得的Unix和Linux版本上找到，因此对必须在多个版本Unix上工作的人有用。在基于Unix的操作系统上，一些实用工具如SQL Plus（英语：）运行ed作为编辑器，如果EDITOR和VISUAL环境变量没有定义的话。如果在故障的情况下，ed有时是唯一可获得的编辑器。这几乎是它交互式使用的唯一时刻。

ed命令在其他基于行的编辑器中经常被模仿。例如，在早期版本的MS-DOS和32-bit版本的Windows NT中，EDLIN（英语：）有某种程度上类似的语法，在很多MUD（LPMud（英语：）和后代）中的文本编辑器使用类似ed的语法。但是这些编辑器典型的在功能上更加有限。

例子
--

下面是一个ed会话的例子抄录。为了清晰，命令和用户键入的文本使用正常字型，而来自ed的输出被加粗。

```
a
ed is the standard Unix text editor.
This is line number two.
.
2i
 
.
,l
**ed is the standard Unix text editor.$**
**$**
**This is line number two.$**
3s/two/three/
,l
**ed is the standard Unix text editor.$**
**$**
**This is line number three.$**
w text
**65**
q
```

最后结果是包含下列文本的一个简单文本文件:

```
ed is the standard Unix text editor.
 
This is line number three.
```

开始于一个空文件，`a`命令附加文本，所有ed命令都是单一字母。这个命令安置ed进入"插入模式"，插入随后的字符，并由只有一个单一的点的行终止。在此点终止前键入的两行进入文件缓冲区。`2i`命令也进入插入模式，并在第2行之前插入键入的文本，这里是空行。所有命令都可以前缀一个行号来在此行上进行操作。

在行`,l`中，l表示列表命令。这个命令前缀着一个范围，这里是`,`，它是`1,$`的简写。范围是由逗号分隔的两个行号，`$`意味着最后一行。作为回应，ed列出所有行，从最先至最后。这些行用美元号终结，所以在行尾的空白明显可见。

一旦空行被插入到第2行前，读作"This is line number two"的行，现在实际上是第3行。这个错误使用`3s/two/three/`命令来更正，这是替换命令。`3`指定应用这个命令的那个行；随后是要被替换的文本，接着是要替代成的文本。现在用`,l`命令列出的行是正确的了。 

`w text`命令写缓冲区到文件"text"，使得ed用"65"来响应，这是写到文件中的字符数目。`q`命令结束ed会话。

参见
--

* ex (文本编辑器)，最初是扩展版本的ed。
* vi，基于ex的可视全屏幕编辑器.
* sed，基于ed内脚本特征的标准UNIX流式编辑器。
* Edlin（英语：），受ed影响的标准MS-DOS行编辑器。
* Sam (文本编辑器)（英语：）
* 编辑器之战
* Unix实用程序列表

引用
--

1. ↑  Salus, Peter H.. Groklaw. 2005  [2019-06-02]. （原始内容存档于2017-07-04）.
2. ↑  `ed` – 命令与工具（Commands & Utilities）参考，单一UNIX®规范第7期，由國際開放標準組織发布
3. ↑  The Peter H. Salus, Daemon, the Gnu and the Penguin. Ch. 2 & 3. Thursday, April 14, 2005 @ 10:56 PM EDT.  （页面存档备份，存于） Accessed 10/29/2015.
4. ↑  D. M. Ritchie and K. L. Thompson, "QED Text Editor", MM-70-1373-3 (June 1970), reprinted as "QED Text Editor Reference Manual", MHCC-004, Murray Hill Computing, Bell Laboratories (October 1972).
5. ↑  McIlroy, M. D.  (PDF) (技术报告). CSTR. Bell Labs. 1987  [2019-06-02]. 139. （原始内容存档 (PDF)于2019-11-30）.
6. 1 2  Donald A. Norman.  (PDF). Datamation. 1981  [2019-06-02]. （原始内容存档 (PDF)于2014-04-16）.
7. ↑  Administering SQL\*Plus.  （页面存档备份，存于） Accessed 7/23/2016.

外部链接
----

* `ed`: edit text – 命令与工具（Commands & Utilities）参考，单一UNIX®规范第7期，由國際開放標準組織发布
* 描述ed的Unix第一版手册页（页面存档备份，存于）。
* GNU ed homepage（页面存档备份，存于）。
* `ed(1)`: text editor – Version 7 Unix Programmer's Manual
* `ed(1)`: text editor – Plan 9通用命令（General Commands）手册页，最初ed的直接后代。
* Win32版本GNU ed（页面存档备份，存于）
* Unix Editors I
* ed用于脚本的例子（页面存档备份，存于）
* ed 幽默("Ed是标准文本编辑器")（页面存档备份，存于）
* 在Berkeley之前的UNIX历史（页面存档备份，存于）章节3.1描述了ed的历史。




|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
Unix命令行程序和shell内建命令 |
| --- |
|  |
| 文件系統 | 
* cat
* cd
* chmod
* chown
* chgrp
* cksum
* cmp
* cp
* dd
* du
* df
* file
* fsck
* fuser
* ln
* ls
* mkdir
* mount
* mv
* pax（英语：）
* pwd
* rm
* rmdir
* size
* split
* stat
* tee
* touch
* type（英语：）
* umask（英语：）

 |
|  |
| 程序 | 
* at
* bg
* chroot
* cron
* fg
* kill
* killall（英语：）
* nice
* pgrep
* pkill（英语：）
* ps
* pstree（英语：）
* time
* top

 |
|  |
| 用户环境 | 
* clear
* env
* exit
* history（英语：）
* id
* logname
* mesg（英语：）
* passwd
* su
* sudo
* uptime
* talk（英语：）
* tput（英语：）
* uname
* w
* wall（英语：）
* who
* whoami
* write（英语：）

 |
|  |
| 文本编辑 | 
* awk
* banner（英语：）
* basename
* comm（英语：）
* csplit（英语：）
* cut
* diff
* dirname
* ed
* ex
* fmt（英语：）
* fold（英语：）
* head（英语：）
* iconv
* join（英语：）
* less
* more
* nl（英语：）
* paste（英语：）
* sed
* sort（英语：）
* spell（英语：）
* strings（英语：）
* tail
* tr
* uniq（英语：）
* vi
* wc
* xargs

 |
|  |
| 壳层内建 | 
* alias
* echo
* printf格式字符串
* test（英语：）
* unset
* wait

 |
|  |
| 网络 | 
* dig
* host
* ifconfig
* inetd（英语：）
* netcat
* netstat
* nslookup
* ping
* rdate（英语：）
* rlogin（英语：）
* route
* ssh
* traceroute

 |
|  |
| 查找 | 
* find
* grep
* locate
* whatis（英语：）
* whereis

 |
|  |
| 文档 | 
* apropos（英语：）
* help（英语：）
* man

 |
|  |
| 软件开发 | 
* ar
* ctags
* lex
* make
* nm
* strip
* yacc

 |
|  |
| 杂项 | 
* bc
* cal
* dc
* expr
* lp（英语：）
* lpr
* sleep
* true和false
* yes

 |
|  |
| Unix实用程序列表 |

 |

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
肯·汤普逊 |
| --- |
|  |
| 操作系统 | 
* Unix
* 貝爾實驗室九號計畫

 |
|  |
| 编程语言 | 
* B語言
* Bon（英语：）
* C语言
* Go

 |
|  |
| 软件 | 
* Belle（英语：）
* QED（英语：）
* ed
* Sam（英语：）
* 星际旅行 (1969年游戏)
* Thompson shell

 |
|  |
| 字符编码 | 
* UTF-8

 |

 |