Go to the next section.

Copyright (C) 1993, 1994 Free Software Foundation, Inc.

Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.

Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.

Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that this permission notice may be stated in a translation approved by the Foundation.

Intro

ed is a line-oriented text editor. It is used to create, display, modify and otherwise manipulate text files, both interactively and via shell scripts. A restricted version of ed, red, can only edit files in the current directory and cannot execute shell commands. ed is the "standard" text editor in the sense that it is the original editor for Unix, and thus widely available. For most purposes, however, it is superceded by full-screen editors such as Emacs and Vi.

The sample sessions below illustrate some basic concepts of line editing with ed. We begin by creating a file, `sonnet', with some help from Shakespeare. As with the shell, all input to ed must be followed by a newline character. Comments begin with a `#'.

$ ed
# The `a' command is for appending text to the editor buffer.
a
No more be grieved at that which thou hast done.
Roses have thorns, and filvers foutians mud.
Clouds and eclipses stain both moon and sun,
And loathsome canker lives in sweetest bud.
.
# Entering a single period on a line returns ed to command mode.
# Now write the buffer to the file `sonnet' and quit:
w sonnet
183
# ed reports the number of characters written.
q
$ ls -l
total 2
-rw-rw-r--    1 alm           183 Nov 10 01:16 sonnet
$

Editing with ed is done in two distinct modes: command and input. When first invoked, ed is in command mode. In this mode commands are read from the standard input and executed to manipulate the contents of the editor buffer. When an input command, such as `a' (append), `i' (insert) or `c' (change), is given, ed enters input mode. This is the primary means of adding text to a file. In this mode, no commands are available; instead, the standard input is written directly to the editor buffer. A line consists of the text up to and including a newline character. Input mode is terminated by entering a single period (`.') on a line.

In the next example, some typos are corrected in the file `sonnet'.

$ ed sonnet
183
# Begin by printing the buffer to the terminal with the `p' command.
# The `,' means "all lines."
,p
No more be grieved at that which thou hast done.
Roses have thorns, and filvers foutians mud.
Clouds and eclipses stain both moon and sun,
And loathsome canker lives in sweetest bud.
# Select line 2 for editing.
2
Roses have thorns, and filvers foutians mud.
# Use the substitute command, `s', to replace `filvers' with `silver',
# and print the result.
s/filvers/silver/p
Roses have thorns, and silver foutians mud.
# And correct the spelling of `fountains'.
s/utia/untai/p
Roses have thorns, and silver fountains mud.
w sonnet
183
q
$

ed may be invoked with or without arguments See section Invoking GNU ed. When invoked with a file argument, a copy of file is read into the editor's buffer. Changes are made to this copy and not directly to file itself. Upon quitting ed, any changes not explicitly saved with a `w' command See section Commands are lost.

Since ed is line-oriented, we have to tell it which line, or range of lines we want to edit. In the above example, we do this by specifying the line's number, or sequence in the buffer. Alternatively, we could have specified a unique string in the line, e.g., `/filvers/', where the `/'s delimit the string in question. Subsequent commands affect only the selected line, a.k.a. the current line. Portions of that line are then replaced with the substitute command, whose syntax is `s/old/new/'.

Although ed accepts only one command per line, the print command `p' is an exception, and may be appended to the end of most commands.

In the next example, a title is added to our sonnet.

$ ed sonnet
183
a
 Sonnet #50
.
,p
No more be grieved at that which thou hast done.
Roses have thorns, and silver fountains mud.
Clouds and eclipses stain both moon and sun,
And loathsome canker lives in sweetest bud.
 Sonnet #50
# The title got appended to the end; we should have used `0a'
# to append "before the first line."
# Move the title to its proper place.
5m0p
 Sonnet #50
# The title is now the first line, and the current line has been
# set to this line as well.
,p
 Sonnet #50
No more be grieved at that which thou hast done.
Roses have thorns, and silver fountains mud.
Clouds and eclipses stain both moon and sun,
And loathsome canker lives in sweetest bud.
wq sonnet
195
$

When ed opens a file, the current line is initially set to the last line of that file. Similarly, the move command `m' sets the current line to the last line moved.

In summary: All ed commands operate on whole lines or ranges of lines; e.g., the `d' command deletes lines; the `m' command moves lines, and so on. It is possible to modify only a portion of a line by means of replacement, as in the second example above. However even there, the `s' command is applied to whole lines at a time.

Structurally, ed commands consist of zero or more line addresses, followed by a single character command and possibly additional parameters; i.e., commands have the structure:

[address [,address]]command[parameters]

The address(es) indicate the line or range of lines to be affected by the command. If fewer addresses are given than the command accepts, then default addresses are supplied.

Related programs or routines are vi (1), sed (1), regex (3), sh (1). Relevant documents are:

Unix User's Manual Supplementary Documents: 12 -- 13

B. W. Kernighan and P. J. Plauger: "Software Tools in Pascal", Addison-Wesley, 1981.

Go to the next section.