MirBSD manpage: ed(1)
ED(1) BSD Reference Manual ED(1)
NAME
ed - the standard text editor
SYNOPSIS
ed [-] [-s] [-p string] [file]
DESCRIPTION
ed is a line-oriented text editor. It is used to create, display, modify
and otherwise manipulate text files. If 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 are lost.
Editing is done in two distinct modes: command and input. When first in-
voked, 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.
A typical command might look like:
,s/old/new/g
which replaces all occurrences of the string "old" with "new".
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. Lines consist of text up
to and including a newline character. Input mode is terminated by enter-
ing a single period ('.') on a line.
All ed commands operate on whole lines or ranges of lines; for example,
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 example above. However, even here, the s command is applied to
whole lines at a time.
In general, ed commands consist of an optional address list followed by a
single character command and possibly additional parameters:
[address-list]command[parameters]
Some commands do not expect an address list; passing one causes an error.
A number of commands use the right-most address from the list to indicate
the line to be affected by that command; all other commands affect the
range of lines specified by the right-most two addresses.
Many ed commands and line addresses support basic regular expressions
(BREs). See re_format(7) for more information on regular expressions.
The options are as follows:
- Same as the -s option (deprecated).
-p string Specifies a command prompt. This may be toggled on and off
with the P command.
-s Suppress diagnostics. This should be used if ed standard input
is from a script.
file Specifies the name of a file to read. If file is prefixed with
a bang ('!'), it is interpreted as a shell command. In this
case, what is read is the standard output of file executed via
sh(1). To read a file whose name begins with a bang, prefix
the name with a backslash ('\'). The default filename is set
to file only if it is not prefixed with a bang.
LINE ADDRESSING
An address represents the number of a line in the buffer. The address 0
(zero) is an exception to this rule, meaning "before the first line" and
being legal wherever it makes sense. ed maintains a current address which
is typically supplied to commands as the default address when none is
specified. When a file is first read, the current address is set to the
last line of the file. In general, the current address is set to the last
line affected by a command.
A line address is constructed from one of the bases in the list below,
optionally followed by an offset composed of any combination of operators
('+', '-' and '^'), digits and whitespace. Addresses are read from left
to right, and their values are computed relative to the current address.
Commands (see below) are either prefixed by an address list, in which
case they take the rightmost one or two (depending on the command) ad-
dresses, or not, in which case attempting to pass one is an error.
in the latter case Prefixing an It is If not, i
Address ranges are comprised of at least one separator (comma or
semicolon) optionally surrounded by addresses. If the address before the
first separator is omitted, it defaults to 1 (if the separator is a com-
ma) or the current address (for semicolon). If any other address is omit-
ted, it defaults to the one calculated for the position left of the
corresponding separator, except if the range consists of a sole separator
it defaults to the last line. Address ranges yield two or more addresses,
which are calculated left to right; the semicolon separator updates the
current address to the left-hand result before calculating the right-hand
address, whereas each address in comma-separated ranges is interpreted
relative to the initial current address.
Commands (see below) expect to be prefixed by zero, one or two addresses.
Address ranges may only be used in front of commands expecting addresses.
If the range contains more addresses than expected, the correct amount is
taken from the right-most ones in the range; this is useful with the
semicolon separator, updating the current address multiple times.
The following address symbols are recognised:
. The current line (address) in the buffer.
$ The last line in the buffer.
n The nth line in the buffer, where n is a number in the range
[0,$].
- or ^ The previous line. This is equivalent to -1 and may be repeated
with cumulative effect.
-n or ^n
The nth previous line, where n is a non-negative number.
+ The next line. This is equivalent to +1 and may be repeated with
cumulative effect.
+n The nth next line, where n is a non-negative number.
, or % The first through last lines in the buffer. This is equivalent to
the address range 1,$.
; The current through last lines in the buffer. This is equivalent
to the address range .,$.
/re/ The next line containing the regular expression re. The search
wraps to the beginning of the buffer and continues down to the
current line, if necessary. The second slash can be omitted if it
ends a line. "//" repeats the last search.
?re? The previous line containing the regular expression re. The
search wraps to the end of the buffer and continues up to the
current line, if necessary. The second question mark can be omit-
ted if it ends a line. "??" repeats the last search.
'lc The line previously marked by a k (mark) command, where lc is a
lower case letter.
COMMANDS
All ed commands are single characters, though some require additional
parameters. If a command's parameters extend over several lines, each
line except for the last must be terminated with a backslash ('\').
In general, at most one command is allowed per line. However, most com-
mands accept a print suffix, which is any of p (print), l (list), or n
(enumerate), to print the last line affected by the command.
ed recognises the following commands. The commands are shown together
with the default address or address range supplied if none is specified
(in parentheses), and other possible arguments on the right.
(.)a Appends text to the buffer after the addressed line. Text is en-
tered in input mode. The current address is set to last line en-
tered.
(.,.)c
Changes lines in the buffer. The addressed lines are deleted from
the buffer, and text is appended in their place. Text is entered in
input mode. The current address is set to last line entered.
(.,.)d
Deletes the addressed lines from the buffer. If there is a line
after the deleted range, the current address is set to this line;
otherwise, it is set to the line before the deleted range.
e file
Edits file and sets the default filename. If file is not specified,
the default filename is used. Any lines in the buffer are deleted
before the new file is read. The current address is set to the last
line read.
e !command
Edits the standard output of !command, (see !command below). The
default filename is unchanged. Any lines in the buffer are deleted
before the output of command is read. The current address is set to
the last line read.
E file
Edits file unconditionally. This is similar to the e command, ex-
cept that unwritten changes are discarded without warning. The
current address is set to the last line read.
f file
Sets the default filename to file. If file is not specified, the
default unescaped filename is printed.
(1,$)g/re/command-list
Mark each addressed line matching the regular expression re for
modification. The current address is set to each marked line in
turn, and then the command-list is executed each time. The
command-list can change the current line number, and it is not
changed back after the command-list ended. When a marked line is
changed, it is unmarked and the command-list won't be executed for
it any more. If no lines were matched, the current line number
remains unchanged.
Each command in command-list must be on a separate line, and every
line except for the last must be terminated by a backslash ('\').
Any commands are allowed, except for g, G, v and V. An empty
command-list is equivalent to a p command - unlike for the G com-
mand, where an empty command-list does nothing, and unlike an empty
command, which is equivalent to the command +p. If the command-list
is empty, the trailing slash can be omitted.
(1,$)G/re/
Interactively edits the addressed lines matching a regular expres-
sion re. The trailing slash after re can be omitted. For each
matching line, the line is printed, the current address is set, and
the user is prompted to enter a command-list. At the end of the G
command, the current address is set to the last line affected by
(the last) command-list. If no lines were matched, the current line
number remains unchanged.
The format of command-list is the same as that of the g command,
but an empty command list does nothing. A single '&' repeats the
last non-empty command list.
H Toggles the printing of error explanations. By default, explana-
tions are not printed. It is recommended that ed scripts begin with
this command to aid in debugging.
h Prints an explanation of the last error.
(.)i Inserts text in the buffer before the current line. Text is entered
in input mode. The current address is set to the last line entered.
(.,+)j
Joins the addressed lines. The addressed lines are deleted from the
buffer and replaced by a single line containing their joined text.
The current address is set to the resultant line.
(.)klc
Marks a line with a lower case letter lc. The line can then be ad-
dressed as 'lc (i.e., a single quote followed by lc) in subsequent
commands. The mark is not cleared until the line is deleted or oth-
erwise modified.
(.,.)l
Prints the addressed lines unambiguously. The current address is
set to the last line printed.
(.,.)m(.)
Moves lines in the buffer. The addressed lines are moved to after
the right-hand destination address, which may be the address 0
(zero). The current address is set to the last line moved.
(.,.)n
Prints the addressed lines along with their line numbers. The
current address is set to the last line printed.
(.,.)p
Prints the addressed lines. The current address is set to the last
line printed.
P Toggles the command prompt on and off. Unless a prompt was speci-
fied with the command-line option -p string, the command prompt is
by default turned off.
q Quits ed.
Q Quits ed unconditionally. This is similar to the q command, except
that unwritten changes are discarded without warning.
($)r file
Reads file to after the addressed line. If file is not specified,
the default filename is used. If no default filename was set prior
to the command, the default filename is set to file; otherwise, it
is unchanged. The current address is set to the last line read.
($)r !command
Reads to after the addressed line the standard output of !command,
(see !command below). The default filename is unchanged. The
current address is set to the last line read.
(.,.)s/re/replacement/ (.,.)s/re/replacement/g (.,.)s/re/replacement/n
Replaces text in the addressed lines matching a regular expression
re with replacement. By default, only the first match in each line
is replaced. If the g (global) suffix is given, every match is re-
placed. The n suffix, where n is a positive number, causes only the
nth match to be replaced. It is an error if no substitutions are
performed on any of the addressed lines. The current address is set
the last line affected.
re and replacement may be delimited by any character other than
space and newline (see the s command below). If one or two of the
last delimiters are omitted, the last line affected is printed as
though the print suffix p were specified.
An unescaped '&' in replacement will substitute the currently
matched text. The character sequence \m, where m is a number in the
range [1,9], is replaced by the mth backreference expression of the
matched text. If the entire replacement consists of a single '%',
the replacement from the last substitution is used. Newlines may be
embedded in replacement if they are escaped with a backslash ('\').
(.,.)s
Repeats the last substitution. This form of the s command accepts a
count suffix n, or any combination of the characters r, g and p. If
a count suffix n is given, only the nth match is replaced. The r
suffix causes the regular expression of the last search to be used
instead of that of the last substitution. The g suffix toggles the
global suffix of the last substitution. The p suffix toggles the
print suffix of the last substitution. The current address is set
to the last line affected.
(.,.)t(.)
Copies (i.e., transfers) the addressed lines to after the right-
hand destination address, which may be the address 0 (zero). The
current address is set to the last line copied.
u Undoes the last command and restores the current address to what it
was before the command. The global commands g, G, v and V are
treated as a single command by undo. u is its own inverse.
(1,$)v/re/command-list
The same as the g command, except that it applies command-list to
each of the addressed lines not matching the regular expression re.
(1,$)V/re/
The same as the G command, except that it interactively edits the
addressed lines not matching the regular expression re.
(1,$)w file
Writes the addressed lines to file. Any previous contents of file
are lost without warning. The default filename will be set to file
iff it was not set before. If file was not specified, the default
filename is used. The current address is unchanged.
(1,$)wq file
Writes the addressed lines to file, then executes a q command.
(1,$)w !command
Writes the addressed lines to the standard input of !command, (see
!command below). The default filename and current address are un-
changed.
(1,$)W file
Appends the addressed lines to the end of file. This is similar to
the w command, except that the previous contents of file are not
clobbered. The current address is unchanged.
(+)zn
Scrolls n lines at a time starting at addressed line. If n is not
specified, the current window size is used. The current address is
set to the last line printed.
($)= Prints the line number of the addressed line.
(+) An address without a command prints the addressed line and sets the
current address to that line. If the address is also omitted, it
defaults to the next line (+).
!command
Executes command via sh(1). If the first character of command is
'!', it is replaced by text of the previous !command. ed does not
process command for '\' (backslash) escapes. However, an unescaped
'%' is replaced by the default filename. When the shell returns
from execution, a '!' is printed to the standard output. The
current line is unchanged.
ASYNCHRONOUS EVENTS
SIGHUP If the current buffer has changed since it was last written,
ed attempts to write the buffer to the file ed.hup. Nothing is
written to the currently remembered file, and ed exits.
SIGINT When an interrupt occurs, ed prints '?' and a newline, then
returns to command mode. If interrupted during text input, the
text already input is written to the current buffer, as if
text input had been normally terminated.
SIGQUIT This signal is ignored.
SIGWINCH The screen is resized.
ENVIRONMENT
TMPDIR location to use for temporary files
FILES
/tmp/ed.* buffer file (actually in $TMPDIR if set)
ed.hup where ed attempts to write the buffer if the terminal hangs up
EXIT STATUS
The ed utility exits 0 on success, and >0 if an error occurs.
DIAGNOSTICS
When an error occurs, ed prints a '?' and either returns to command mode
or exits if its input is from a script. An explanation of the last error
can be printed with the h (help) command.
Since the g (global) command masks any errors from failed searches and
substitutions, it can be used to perform conditional operations in
scripts; e.g.,
g/old/s//new/
replaces any occurrences of "old" with "new".
If the u (undo) command occurs in a global command list, the command list
is executed only once.
If diagnostics are not disabled, attempting to quit ed or edit another
file before writing a modified buffer results in an error. If the command
is entered a second time, it succeeds, but any changes to the buffer are
lost.
SEE ALSO
sed(1), sh(1), vi(1), re_format(7)
B. W. Kernighan, A Tutorial Introduction to the UNIX Text Editor,
09.edtut(USD).
B. W. Kernighan, Advanced Editing on UNIX, 10.edadv(USD).
http://www.gnu.org/fun/jokes/ed.html (other implementations, humorous)
http://www.gnu.org/fun/jokes/ed-msg.html (mandatory read before learning)
B. W. Kernighan and P. J. Plauger, Software Tools in Pascal, 1981,
Addison-Wesley.
STANDARDS
The ed utility is compliant with the IEEE Std 1003.1-2008 ("POSIX.1")
specification.
The commands s (to repeat the last substitution), W, wq and z as well as
the address specifier '%' are extensions to that specification.
The IEEE Std 1003.1-2008 ("POSIX.1") specification says the '^' address
specifier is neither required nor prohibited; additionally, it says
behaviour for the - option is "unspecified".
HISTORY
An ed command appeared in Version 1 AT&T UNIX.
CAVEATS
ed processes file arguments for backslash escapes, i.e., in a filename,
any characters preceded by a backslash ('\') are interpreted literally.
If a text (non-binary) file is not terminated by a newline character, ed
appends one on reading/writing it. In the case of a binary file, ed does
not append a newline on reading/writing.
MirBSD #10-current August 13, 2021 6