ed(1)
_________________________________________________________________
ed, red Command
text editor
_________________________________________________________________
SYNTAX
ed [ - ] [ -s ] [ -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 -s
option 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.
NOTE:
The - option, supported in this release for upward
compatibility, will not be supported in the next major
release of the system. Convert shell scripts that use the -
option to use the -s option instead.
The -p option lets the user specify a prompt string. If -x is
present, an x command is simulated first to handle an encrypted
file (U.S. versions of DG/UX only; encryption mechanisms are not
included in international distributions of DG/UX). 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 only editing of
files in the current directory. It prohibits executing shell
commands via !shell command. Attempts to bypass these
restrictions result in an 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 automatically be
used when scanning file. For example, if the first line of a
file contained:
DG/UX 4.00 Page 1
Licensed material--property of copyright holder(s)
ed(1)
<: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. NOTE: while inputting 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, possibly
followed by 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 can very
often be omitted.
In general, only one command may appear on a line. Certain
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 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 (RE) 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:
I. The following one-character REs match a single character:
1. An ordinary character (not one of those discussed in 2.
below) is a one-character RE that matches itself.
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 I.4 below).
b. ^ (caret or circumflex), which is special at the
beginning of an entire RE (see III.1 and III.2
below), or when it immediately follows the left of a
pair of square brackets ([]) (see I.4 below).
c. $ (currency symbol), which is special at the end of
an entire RE (see III.2 below).
d. The character used to bound (i.e., delimit) an
DG/UX 4.00 Page 2
Licensed material--property of copyright holder(s)
ed(1)
entire RE, which is special for that RE (for
example, see how slash (/) is used in the g command,
below.)
3. A period (.) is a one-character RE that matches any
character except new-line.
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 new-line and the
remaining characters in the string. The ^ has this
special meaning only if it occurs first in the string.
The minus (-) can 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 I.2.a above
stand for themselves within such a string of characters.
II. The following rules can construct REs from one-character
REs:
1. A one-character RE is a RE that matches whatever the one-
character RE matches.
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.
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.
4. The concatenation of REs is a RE that matches the
concatenation of the strings matched by each component of
the RE.
5. A RE enclosed between the character sequences \( and \) is
a RE that matches whatever the unadorned RE matches.
DG/UX 4.00 Page 3
Licensed material--property of copyright holder(s)
ed(1)
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 begins with the n-th occurrence of \(
counting from the left. For example, the expression
^\(.*\)\1$ matches a line consisting of two repeated
appearances of the same string.
III. Finally, an entire RE may be constrained to match only an
initial segment or final segment of a line (or both).
1. A circumflex (^) at the beginning of an entire RE
constrains that RE to match an initial segment of a line.
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 also the last 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. IV..I 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 lowercase letter. Lines are marked
with the k command described below.
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 also the last
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
DG/UX 4.00 Page 4
Licensed material--property of copyright holder(s)
ed(1)
stopping at the first line containing a 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
(or 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. 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. 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 treat 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
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.
Usually, no more than one command may appear on a line. However,
any command (except e, f, r, or w) may be suffixed by l, n, or p.
Then, the current line is either listed, numbered or printed as
discussed below under the l, n, and p commands.
DG/UX 4.00 Page 5
Licensed material--property of copyright holder(s)
ed(1)
(.)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 was none, at the addressed line. Address 0 is
legal for this command: it puts the appended text at the
beginning of the buffer. The maximum number of characters
that may be entered from a terminal is 256 per line
(including the new-line 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 deletes the entire contents of the buffer,
and reads in the named file; . is set to the last line of
the buffer. If no file name is given, the currently-
remembered file name, if any, is used (see the f command).
The number of characters read is typed; file is remembered
for possible use as a default file name 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 file name. See also DIAGNOSTICS below.
E file
The Edit command is like e, but 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, the file-name command changes the
currently-remembered file name to file; otherwise, it prints
the currently-remembered file name.
(1,$)g/RE/command list
In the global command, the first step is to mark every line
that matches the given RE. Then, for every such line, the
DG/UX 4.00 Page 6
Licensed material--property of copyright holder(s)
ed(1)
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. The g, G, v,
and V commands are not permitted in the command list. See
also BUGS and the last paragraph before FILES , below.
(1,$)G/RE/
The interactive Global command marks 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 new-
line 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 DEL or BREAK).
h
The help command gives a short error message that explains
the most recent ? diagnostic.
H
The Help command places ed in 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 was 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 new-line character).
(.,.+1)j
The join command joins contiguous lines by removing the
appropriate new-line characters. If exactly one address is
given, this command does nothing.
DG/UX 4.00 Page 7
Licensed material--property of copyright holder(s)
ed(1)
(.)kx
The mark command marks the addressed line with name x, which
must be a lowercase letter. The address 'x then addresses
this line; . is unchanged.
(.,.)l
The list command prints the addressed lines in an
unambiguous way: a few non-printing characters (e.g., tab,
backspace) are represented by (hopefully) 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
The move command repositions the addressed line(s) after the
line addressed by a. Address 0 is legal for a and moves the
addressed line(s) 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
The number command 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
The print command prints 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
The quit command causes ed to exit. No automatic write of a
file is done (but see DIAGNOSTICS below).
Q
The editor exits 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 file name is given, the currently-remembered
file name, if any, is used (see e and f commands). The
currently-remembered file name is not changed unless file is
the very first file name mentioned since ed was invoked.
DG/UX 4.00 Page 8
Licensed material--property of copyright holder(s)
ed(1)
Address 0 is legal for r and causes the file to 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 the current
directory to the end of the file being edited. Such a shell
command is not remembered as the current file name.
(.,.)s/RE/replacement/ or
(.,.)s/RE/replacement/g or
(.,.)s/RE/replacement/n n = 1-512
The substitute command searches 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. If a number n appears after the
command, only the nth occurence 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 new-line may be used instead of / to
delimit the RE and the replacement; . is left at the last
line on which a substitution occurred. See also the last
paragraph before FILES below.
An ampersand (&) appearing in the replacement is replaced by
the string matching the RE on the current line. You can
suppress the special meaning of & in this context 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 \.
You can split a line by substituting a new-line character
into it. The new-line 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
This command acts just like the m command, but a copy of the
addressed lines is placed after address a (which may be 0);
. is left at the last line of the copy.
DG/UX 4.00 Page 9
Licensed material--property of copyright holder(s)
ed(1)
u
The undo command nullifies the effect of 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 , but 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
but the lines that are marked during the first step are
those that do not match the RE.
(1,$)w file
The write command writes 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 file name is not changed unless file is the very
first file name mentioned since ed was invoked. If no file
name is given, the currently-remembered file name, 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 file name.
X
(NOT available in international distributions of DG/UX; U.S.
only) 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 line number of the addressed line is typed; . is
unchanged by this command.
!shell command
The remainder of the line after the ! is sent to the UNIX
system shell (sh(1)) to be interpreted as a command. Within
the text of that command, the unescaped character % is
replaced with the remembered file name; 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.
DG/UX 4.00 Page 10
Licensed material--property of copyright holder(s)
ed(1)
(.+1)<new-line>
An address alone on a line prints the addressed line. A
new-line alone is equivalent to .+1p; it is useful for
stepping forward through the buffer.
If an interrupt signal (ASCII DEL 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 new-line. 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 an RE or of a replacement string
(e.g., /) would be the last character before a new-line, that
delimiter may be omitted. 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?
FILES
/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 help and Help 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 lets you continue editing. A second e or q command at this
point will take effect. The - command-line option inhibits this
feature.
SEE ALSO
crypt(1), grep(1), sed(1), sh(1), stty(1).
DG/UX 4.00 Page 11
Licensed material--property of copyright holder(s)
ed(1)
fspec(4), regexp(5) in the Programmer's Reference for the DG/UX
System
CAVEATS AND BUGS
A ! command cannot be subject to a g or a v command.
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 new-line character.
The l command mishandles DEL.
Files encrypted directly with the crypt(1) command with the null
key cannot be edited.
Characters are masked to 7 bits on input.
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 in that file.
DG/UX 4.00 Page 12
Licensed material--property of copyright holder(s)