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)

     "A Tutorial Introduction to the UNIX Text Editor",
     /usr/share/doc/usd/09.edtut/.

     "Advanced Editing on UNIX", /usr/share/doc/usd/10.edadv/.

     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             October 27, 2020                              6

Generated on 2021-01-25 02:04:05 by $MirOS: src/scripts/roff2htm,v 1.103 2021/01/23 20:24:35 tg Exp $ — This product includes material provided by mirabilos.

These manual pages and other documentation are copyrighted by their respective writers; their sources are available at the project’s CVSweb, AnonCVS and other mirrors. The rest is Copyright © 2002–2021 MirBSD.

This manual page’s HTML representation is supposed to be valid XHTML/1.1; if not, please send a bug report — diffs preferred.