ed(1) ed(1)
NAME
ed, red - text editor
SYNOPSIS
ed [-] [-p string] [-x] [file]
red [-] [-p string] [-x] [file]
DESCRIPTION
ed is the standard text editor. If the file argument is
given, ed simulates an e command (see below) on the named
file; that is to say, the file is read into ed's buffer so
that it can be edited. The optional - suppresses the
printing of character counts by e, r, and w commands, of
diagnostics from e and q commands, and of the ! prompt after
a !shell command. The -p flag option allows the user to
specify a prompt string. The string must be enclosed in
double quotes. If -x is present, an X command is simulated
first to handle an encrypted file. ed operates on a copy of
the file it is editing; changes made to the copy have no
effect on the file until a w (write) command is given. The
copy of the text being edited resides in a temporary file
called the buffer. There is only one buffer.
red is a restricted version of ed. It will allow editing of
files only in the current directory. It prohibits executing
shell commands via !shell command. Attempts to bypass these
restrictions result in the error message:
restricted shell
Both ed and red support the fspec(4) formatting capability.
After including a format specification as the first line of
file and invoking ed with your terminal in stty -tabs or
stty tab3 mode (see stty(1), the specified tab stops will be
used automatically when scanning file. For example, if the
first line of a file contained:
<:t5,10,15 s72:>
tab stops would be set at columns 5, 10, and 15, and a
maximum line length of 72 would be imposed. While entering
text, tab characters, when typed, are expanded to every
eighth column, as is the default.
Commands to ed have a simple and regular structure: zero,
one, or two addresses followed by a single-character
command, followed by any applicable parameters to that
command. These addresses specify one or more lines in the
buffer. Every command that requires addresses has default
addresses, so that the addresses very often can be omitted.
In general, only one command may appear on a line. Certain
Page 1 (last mod. 1/16/87)
ed(1) ed(1)
commands allow the input of text. This text is placed in
the appropriate place in the buffer. While ed is accepting
text, it is said to be in ``input mode.'' In this mode, no
commands are recognized; all input is merely collected.
Input mode is left by typing a period (.) alone at the
beginning of a line.
ed supports a limited form of ``regular expression'' (RE)
notation; regular expressions are used in addresses to
specify lines and in some commands (e.g., s) to specify
portions of a line that are to be substituted. A regular
expression specifies a set of character strings. A member
of this set of strings is said to be matched by the RE. The
REs allowed by ed are constructed as follows:
The following one-character REs match a single character:
1.1 An ordinary character (not one of those discussed in
1.2 below) is a one-character RE that matches itself.
1.2 A backslash (\) followed by any special character is a
one-character RE that matches the special character
itself. The special characters are:
a. ., *, [, and \ (period, asterisk, left square
bracket, and backslash, respectively), which are
always special, except when they appear within
square brackets ([]; see 1.4 below).
b. ^ (circumflex), which is special at the beginning
of an entire RE (see 3.1 and 3.2 below), or when
it immediately follows the left of a pair of
square brackets ([]) (see 1.4 below).
c. $ (currency symbol), which is special at the end
of an entire RE (see 3.2 below).
d. The character used to bound (i.e., delimit) an
entire RE, which is special for that RE (for
example, see how slash (/) is used in the g
command, below.)
1.3 A period (.) is a one-character RE that matches any
character except newline.
1.4 A non-empty string of characters enclosed in square
brackets ([]) is a one-character RE that matches any
one character in that string. If, however, the first
character of the string is a circumflex (^), the one-
character RE matches any character except newline and
the remaining characters in the string. The ^ has
this special meaning only if it occurs first in the
Page 2 (last mod. 1/16/87)
ed(1) ed(1)
string. The minus (-) may be used to indicate a range
of consecutive ASCII characters; for example, [0-9] is
equivalent to [0123456789]. The - loses this special
meaning if it occurs first (after an initial ^, if
any) or last in the string. The right square bracket
(]) does not terminate such a string when it is the
first character within it (after an initial ^, if
any); e.g., []a-f] matches either a right square
bracket (]) or one of the letters a through f,
inclusive. The four characters listed in 1.2.a
(above) stand for themselves within such a string of
characters.
The following rules may be used to construct REs from one-
character REs:
2.1 A one-character RE is a RE that matches whatever the
one-character RE matches.
2.2 A one-character RE followed by an asterisk (*) is a RE
that matches zero or more occurrences of the one-
character RE. If there is any choice, the longest
leftmost string that permits a match is chosen.
2.3 A one-character RE followed by \{m\}, \{m,\}, or
\{m,n\} is a RE that matches a range of occurrences of
the one-character RE. The values of m and n must be
non-negative integers less than 256:
\{m\} matches exactly m occurrences;
\{m,\} matches at least m occurrences;
\{m,n\} matches any number of occurrences between m
and n inclusive.
Whenever a choice exists, the RE matches as many
occurrences as possible.
2.4 The concatenation of REs is a RE that matches the
concatenation of the strings matched by each component
of the RE.
2.5 A RE enclosed between the character sequences \( and
\) is a RE that matches whatever the unadorned RE
matches.
2.6 The expression \n matches the same string of
characters as was matched by an expression enclosed
between \( and \) earlier in the same RE. Here n is a
digit; the sub-expression specified is that beginning
with the n-th occurrence of \( counting from the left.
Page 3 (last mod. 1/16/87)
ed(1) ed(1)
For example, the expression ^\(.*\)\1$ matches a line
consisting of two repeated appearances of the same
string.
Finally, an entire RE may be constrained to match only an
initial segment or final segment of a line (or both).
3.1 A caret (^) at the beginning of an entire RE
constrains that RE to match an initial segment of a
line.
3.2 A currency symbol ($) at the end of an entire RE
constrains that RE to match a final segment of a line.
The construction ^entire RE$ constrains the entire RE to
match the entire line.
The null RE (e.g., //) is equivalent to the last RE
encountered. See the paragraph before FILES, below.
To understand addressing in ed, it is necessary to know that
at any time there is a current line. Generally speaking,
the current line is the last line affected by a command; the
exact effect on the current line is discussed under the
description of each command. addresses are constructed as
follows:
1. The character . addresses the current line.
2. The character $ addresses the last line of the buffer.
3. A decimal number n addresses the n-th line of the
buffer.
4. 'x addresses the line marked with the mark name
character x, which must be a lower-case letter. Lines
are marked with the k command (described below). If x
was not used to mark a line, 'x addresses line 0.
5. A RE enclosed by slashes (/) addresses the first line
found by searching forward from the line following the
current line toward the end of the buffer and stopping
at the first line containing a string matching the RE.
If necessary, the search wraps around to the beginning
of the buffer and continues up to and including the
current line, so that the entire buffer is searched.
See the paragraph before FILES, below.
6. A RE enclosed in question marks (?) addresses the
first line found by searching backward from the line
preceding the current line toward the beginning of the
buffer and stopping at the first line containing a
Page 4 (last mod. 1/16/87)
ed(1) ed(1)
string matching the RE. If necessary, the search
wraps around to the end of the buffer and continues up
to and including the current line. See also the last
paragraph before FILES, below.
7. An address followed by a plus sign (+) or a minus sign
(-) followed by a decimal number specifies that
address plus (respectively minus) the indicated number
of lines. The plus sign may be omitted.
8. If an address begins with + or -, the addition or
subtraction is taken with respect to the current line;
e.g, -5 is understood to mean .-5.
9. If an address ends with + or -, then 1 is added to or
subtracted from the address, respectively. As a
consequence of this rule and of rule 8 immediately
above, the address - refers to the line preceding the
current line. (To maintain compatibility with earlier
versions of the editor, the character ^ in addresses
is entirely equivalent to -.) Moreover, trailing + and
- characters have a cumulative effect, so -- refers to
the current line less 2.
10. For convenience, a comma (,) stands for the address
pair 1,$, while a semicolon (;) stands for the pair
.,$.
Commands may require zero, one, or two addresses. Commands
that require no addresses regard the presence of an address
as an error. Commands that accept one or two addresses
assume default addresses when an insufficient number of
addresses is given; if more addresses are given than such a
command requires, the last one(s) are used.
Typically, addresses are separated from each other by a
comma (,). They may also be separated by a semicolon (;).
In the latter case, the current line (.) is set to the first
address, and only then is the second address calculated.
This feature can be used to determine the starting line for
forward and backward searches (see rules 5. and 6. above).
The second address of any two-address sequence must
correspond to a line that follows, in the buffer, the line
corresponding to the first address.
In the following list of ed commands, the default addresses
are shown in parentheses. The parentheses are not part of
the address; they show that the given addresses are the
default.
It is generally illegal for more than one command to appear
on a line. Any command (except e, f, r, or w) may be
Page 5 (last mod. 1/16/87)
ed(1) ed(1)
suffixed by l, n or p, however, in which case the current
line is either listed, numbered or printed, respectively, as
discussed below under the l, n and p commands.
(.)a
text
. The append command reads the given text and
appends it after the addressed line; . is left at
the last inserted line, or, if there were none,
at the addressed line. Address 0 is legal for
this command: it causes the appended text to be
placed at the beginning of the buffer. The
maximum number of characters that may be entered
from a terminal is 256 per line (including the
newline character).
(.)c
text
. The change command deletes the addressed lines,
then accepts input text that replaces these
lines; . is left at the last line input, or, if
there were none, at the first line that was not
deleted.
(.,.)d The delete command deletes the addressed lines
from the buffer. The line after the last line
deleted becomes the current line; if the lines
deleted were originally at the end of the buffer,
the new last line becomes the current line.
e file The edit command causes the entire contents of
the buffer to be deleted, and then the named file
to be read in; . is set to the last line of the
buffer. If no file name is given, the
currently-remembered filename, if any, is used
(see the f command). The number of characters
read is typed; file is remembered for possible
use as a default filename in subsequent e, r, and
w commands. If file is replaced by !, the rest
of the line is taken to be a shell (sh(1))
command whose output is to be read. Such a shell
command is not remembered as the current
filename. See also DIAGNOSTICS, below.
E file The E command is like e, except that the editor
does not check to see if any changes have been
made to the buffer since the last w command.
f file If file is given, this command changes the
currently-remembered filename to file; otherwise,
it prints the currently-remembered filename.
(1,$)g/RE/command list
Page 6 (last mod. 1/16/87)
ed(1) ed(1)
In the global command, the first step is to mark
every line that matches the given RE. Then, for
every such line, the given command list is
executed with . initially set to that line. A
single command or the first of a list of commands
appears on the same line as the global command.
All lines of a multi-line list except the last
line must be ended with a \; a, i, and c commands
and associated input are permitted. The .
terminating input mode may be omitted if it would
be the last line of the command list. An empty
command list is equivalent to the p command.
(1,$)G/RE/ In the interactive global command, the first step
is to mark every line that matches the given RE.
Then, for every such line, that line is printed,
. is changed to that line, and any one command
(other than one of the a, c, i, g, G, v, and V
commands) may be input and is executed. After
the execution of that command, the next marked
line is printed, and so on; a newline acts as a
null command; an & causes the re-execution of the
most recent command executed within the current
invocation of G. Note that the commands input as
part of the execution of the G command may
address and affect any lines in the buffer. The
G command can be terminated by an interrupt
signal (ASCII DELETE or BREAK). A command that
causes an error terminates the G command.
h The help command gives a short error message that
explains the reason for the most recent ?
diagnostic.
H The Help command causes ed to enter a mode in
which error messages are printed for all
subsequent ? diagnostics. It will also explain
the previous ? if there was one. The H command
alternately turns this mode on and off; it is
initially off.
(.)i
text
. The insert command inserts the given text before
the addressed line; . is left at the last
inserted line, or, if there were none, at the
addressed line. This command differs from the a
command only in the placement of the input text.
Address 0 is not legal for this command. The
maximum number of characters that may be entered
from a terminal is 256 per line (including the
newline character).
Page 7 (last mod. 1/16/87)
ed(1) ed(1)
(.,.+1)j Join contiguous lines by removing the appropriate
newline characters. If exactly one address is
given, this command does nothing.
(.)kx Mark the addressed line with name x, which must
be a lower-case letter. The address 'x then
addresses this line; . is unchanged.
(.,.)l List the addressed lines in an unambiguous way: a
few non-printing characters (e.g., tab,
backspace) are represented by mnemonic
overstrikes. All other non-printing characters
are printed in octal, and long lines are folded.
An l command may be appended to any other command
other than e, f, r, or w.
(.,.)ma Move addressed line(s) to after the line
addressed by a. Address 0 is legal for a and
causes the addressed line(s) to be moved to the
beginning of the file. It is an error if address
a falls within the range of moved lines; . is
left at the last line moved.
(.,.)n Prints the addressed lines, preceding each line
by its line number and a tab character; . is left
at the last line printed. The n command may be
appended to any other command other than e, f, r,
or w.
(.,.)p Print the addressed lines; . is left at the last
line printed. The p command may be appended to
any other command other than e, f, r, or w. For
example, dp deletes the current line and prints
the new current line.
P The editor will prompt with a * for all
subsequent commands. The P command alternately
turns this mode on and off; it is initially off.
q Exit. ed No automatic write of a file is done
(but see DIAGNOSTICS, below).
Q Exit ed without checking if changes have been
made in the buffer since the last w command.
($)r file The read command reads in the given file after
the addressed line. If no filename is given, the
currently-remembered filename, if any, is used
(see e and f commands). The currently-remembered
filename is not changed unless file is the very
first filename mentioned since ed was invoked.
Address 0 is legal for r and causes the file to
Page 8 (last mod. 1/16/87)
ed(1) ed(1)
be read at the beginning of the buffer. If the
read is successful, the number of characters read
is typed; . is set to the last line read in. If
file is replaced by !, the rest of the line is
taken to be a shell (sh(1)) command whose output
is to be read. For example, $r !ls appends
current directory to the end of the file being
edited. Such a shell command is not remembered
as the current filename.
(.,.)s/RE/replacement/ or
(.,.)s/RE/replacement/g or
(.,.)s/RE/replacement/n
Search each addressed line for an occurrence of
the specified RE. In each line in which a match
is found, all (non-overlapped) matched strings
are replaced by the replacement if the global
replacement indicator g appears after the
command. If the global indicator does not
appear, only the first occurrence of the matched
string is replaced. Sometimes substitution of an
RE results in the last (or only) affected line
being printed out. This occurs only when
substitution is not global or of an nth
occurrence. If a number n appears after the
command, only the nth occurrence of the matched
string on each addressed line is replaced. It is
an error for the substitution to fail on all
addressed lines. Any character other than space
or newline may be used instead of / to delimit
the RE and the replacement; . is left at the last
line on which a substitution occurred. See the
paragraph before FILES, below.
An ampersand (&) appearing in the replacement is
replaced by the string matching the RE on the
current line. The special meaning of & in this
context may be suppressed by preceding it by \.
As a more general feature, the characters \n,
where n is a digit, are replaced by the text
matched by the n-th regular subexpression of the
specified RE enclosed between \( and \). When
nested parenthesized subexpressions are present,
n is determined by counting occurrences of \(
starting from the left. When the character % is
the only character in the replacement, the
replacement used in the most recent substitute
command is used as the replacement in the current
substitute command. The % loses its special
meaning when it is in a replacement string of
more than one character or is preceded by a \.
Page 9 (last mod. 1/16/87)
ed(1) ed(1)
A line may be split by substituting a newline
character into it. The newline in the
replacement must be escaped by preceding it by \.
Such substitution cannot be done as part of a g
or v command list.
(.,.)ta Similar to the move (m) command, except that a
copy of the addressed lines is placed after
address a (which may be 0); . is left at the last
line of the copy.
u Undo the most recent command that modified
anything in the buffer, namely the most recent a,
c, d, g, i, j, m, r, s, t, v, G, or V command.
(1,$)v/RE/command list
This command is the same as the global command g,
except that the command list is executed with .
initially set to every line that does not match
the RE.
(1,$)V/RE/ This command is the same as the interactive
global command G except that the lines that are
marked during the first step are those that do
not match the RE.
(1,$)w file
Write the addressed lines into the named file.
If the file does not exist, it is created with
mode 666 (readable and writable by everyone),
unless your umask setting (see sh(1)) dictates
otherwise. The currently-remembered filename is
not changed unless file is the very first
filename mentioned since ed was invoked. If no
filename is given, the currently-remembered
filename, if any, is used (see e and f commands);
. is unchanged. If the command is successful,
the number of characters written is typed. If
file is replaced by !, the rest of the line is
taken to be a shell (sh(1)) command whose
standard input is the addressed lines. Such a
shell command is not remembered as the current
filename.
X A key string is demanded from the standard input.
Subsequent e, r, and w commands will encrypt and
decrypt the text with this key by the algorithm
of crypt(1). An explicitly empty key turns off
encryption. The encryption scheme used here is
not secure.
($)= The line number of the addressed line is typed;
Page 10 (last mod. 1/16/87)
ed(1) ed(1)
address 0 is legal for this command. . is
unchanged by this command.
!shell command
The remainder of the line after the ! is sent to
the system shell (sh(1)) to be interpreted as a
command. Within the text of that command, the
unescaped character % is replaced with the
remembered filename; if a ! appears as the first
character of the shell command, it is replaced
with the text of the previous shell command.
Thus, !! will repeat the last shell command. If
any expansion is performed, the expanded line is
echoed; . is unchanged.
(.+1)newline
An address alone on a line causes the addressed
line to be printed. A newline alone is
equivalent to .+1p; it is useful for stepping
forward through the buffer.
If an interrupt signal (ASCII DELETE or BREAK) is sent, ed
prints a ? and returns to its command level.
Some size limitations: 512 characters per line, 256
characters per global command list, 64 characters per file
name, and 128K characters in the buffer. The limit on the
number of lines depends on the amount of user memory: each
line takes 1 word.
When reading a file, ed discards ASCII NUL characters and
all characters after the last newline. Files (e.g., a.out)
that contain characters not in the ASCII set (bit 8 on)
cannot be edited by ed.
If the closing delimiter of a RE or of a replacement string
(e.g., /) would be the last character before a newline, that
delimiter may be omitted, in which case the addressed line
is printed. The following pairs of commands are equivalent:
s/s1/s2 s/s1/s2/p
g/s1 g/s1/p
?s1 ?s1?
EXAMPLE
ed text
invokes the editor with the file named text. For further
examples, see ``Using ed'' in the Oreo Text Editing Tools.
FILES
/bin/ed
/bin red
Page 11 (last mod. 1/16/87)
ed(1) ed(1)
/tmp/e# temporary; # is the process number.
ed.hup work is saved here if the terminal is hung
up.
DIAGNOSTICS
? for command errors.
?file for an inaccessible file.
(use the h and H commands for detailed
explanations).
If changes have been made in the buffer since the last w
command that wrote the entire buffer, ed warns the user if
an attempt is made to destroy ed's buffer via the e or q
commands. It prints ? and allows one to continue editing.
A second e or q command will take effect at any time,
provided no further changes have been made to the file. The
- command-line flag option inhibits this feature.
SEE ALSO
crypt(1), ex(1), grep(1), sed(1), sh(1), stty(1), fspec(4),
regexp(5).
``Using ed'' in Oreo Text Editing Tools.
CAVEATS AND BUGS
The ! command and the ! escape from the e, r, and w commands
cannot be used if the the editor is invoked from a
restricted shell (see sh(1)).
The sequence \n in a RE does not match a newline character.
The l command mishandles interrupts.
Files encrypted directly with the crypt(1) command with the
null key cannot be edited.
Characters are masked to 7 bits on input.
NOTE
The -x flag option and the editor command X are not
implemented in the international distribution.
If the editor input is coming from a command file (i.e., ed
file < ed-cmd-file), the editor will exit at the first
failure of a command that is in the command file.
Page 12 (last mod. 1/16/87)