Switch to SpeakEasy.net DSL

The Modular Manual Browser

Home Page
Manual: (SunOS-4.1.3)
Apropos / Subsearch:
optional field

ED(1)                       General Commands Manual                      ED(1)

       ed, red - basic line editor

       ed [ - ] [ -sx ] [ -p string ] [ filename ]

       red [ - ] [ -sx ] [ -p string ] [ filename ]

       ed  is  the most basic line editor of the UNIX system.  Although super-
       seded by ex(1) and vi(1) for most purposes, ed is still used by various
       system utilities.

       ed  operates  on  a copy of filename, called a buffer, and overwrites a
       file only when you issue the w (write) command.  ed provides line  ori-
       ented editing commands to display or change lines, to insert and delete
       lines from the buffer, to move or copy lines within the buffer,  or  to
       substitute character strings within lines.

       red is a restricted version of ed.  It will only allow editing of files
       in the current directory, and prohibits executing commands using  !com-
       mand.   Attempts  to  bypass these restrictions result in an error mes-

       -s        Suppress printing of character counts (by e, r,  and  w  com-
                 mands),  diagnostics (by e and q commands), and the !  prompt
                 (after a !  command).  Also, suppress printing the  ?   diag-
                 nostic before overwriting unsaved changes in the buffer.

       -x        Edit an encrypted file (see crypt(1) for details).

       -p string Use string as the editing prompt in command mode.

   Command Structure
       ed  commands  have  a simple and regular structure.  They consist of an
       optional address, or two optional addresses separated  by  a  comma  or
       semicolon,  then a single-character command, which may be followed by a
       parameter for that command:

              [address[ ,address ]]command [parameter]

       If only one address is specified,  operations  are  performed  on  that
       line.  If two addresses are specified, ed performs the operation on the
       inclusive range of lines.  Commands that requires an address  use  cer-
       tain addresses by default, typically the address of the current line.

       For  example,  1,10p  means  "print  (display) lines 1 through 10" (two
       addresses), 5a means "append text after line 5" (one  address),  and  d
       means  "delete the current line" (no address with the current line used
       as default).  The meaning of parameter varies for each operation -- for
       the  move (m) and transfer (t) operations, for instance, it is the line
       that the addressed lines are to be moved to or transferred after.   For
       reading (r) and writing (w) a file, parameter specifies the name of the
       file that is to be read or written.

       ed is extremely terse in its interaction with  the  user.   Its  normal
       response to most problems is simply a question mark (?).  This may hap-
       pen when ed cannot find a specified line in the buffer, or if a  search
       for  a regular expression fails in a substitute (s) command. The h com-
       mand prints a somewhat more complete diagnostic  for  the  most  recent
       error  encountered;  the  H  command  requests  that  the diagnostic be
       printed for all errors.

       Lines can be addressed in several ways:

       nnn    By line number.  Lines in the buffer are  numbered  relative  to
              the  start  of the buffer.  When displayed, line numbers are not
              physically present with the text of the file or buffer.

       $      The last line of the buffer.

       .      The current line.  ed keeps track of the line on which you  last
              performed  an  operation.  This line is called the current line.
              You can address this line by typing a "dot" character.

       +-n    By relative line number.  Address the  line  number  that  is  n
              lines higher, or n lines lower than the current line.

       'c     Address the line marked with the mark character c, which must be
              a lower-case letter.  Lines  are  marked  with  the  k  command,
              described below.

       /RE/   An  RE  is a Regular Expression, described under Regular Expres-
              sions below.  When enclosed by slashes, RE addresses  the  first
              line  found by searching for a matching string.  The search pro-
              ceeds forward from the line  following  the  current  line,  and
              wraps through the beginning of the buffer to include all preced-
              ing lines, as well as the current line.

       ?RE?   An RE enclosed in question marks addresses the first  line  con-
              taining  a  match found by searching backward from the line pre-
              ceding the current line.  The search wraps through  the  end  of
              the  buffer  to include all lines following the current line (in
              reverse order), as well as the current line.

              An address followed by a plus sign (+) or a minus sign (-), fol-
              lowed  by a decimal number, specifies that address plus or minus
              the indicated number of lines.  (The plus sign may be  omitted.)
              If the address is omitted, the current line is used as the base.
              For example, `31-3' addresses line 28 in the buffer.

              If an address ends with `+' or `-', then 1 is added to  or  sub-
              tracted  from  the  address,  respectively.  As a consequence of
              this rule and the previous rule, the address `-' refers  to  the
              line  preceding  the  current  line.  (To maintain compatibility
              with earlier versions of ed, the character `^' is equivalent  to
              `-'.)  Trailing `+' and `-' characters have a cumulative effect,
              so `--' refers to the current line, less 2.

       ,      By itself, a comma stands for the address pair `1,$'.

       ;      A semicolon by itself stands for the pair `.,$'.

              By default for a given  command.   If  you  do  not  specify  an
              address  for a command to operate on, a command that requires an
              address supplies one by default.  This is typically the  current

       A  pair  of addresses separated by a comma signifies an inclusive range
       of lines, and the current  line  is  not  changed  unless  the  command
       changes  it.  When addresses are separated by a semicolon, however, the
       current line is set to the address preceding the semicolon  before  any
       subsequent  addresses  are  interpreted.   This  feature can be used to
       determine the starting line for forward  and  backward  searches  using
       `/', and `?'.

       The  second  address  of  any two-address sequence must correspond to a
       line that occurs later in the buffer than that of the first address.

   Regular Expressions
       ed supports a limited form of regular-expression notation, which can be
       used  in a line address to specify lines by content.  A regular expres-
       sion (RE) specifies a set of character strings to match against -- such
       as "any string containing digits 5 through 9" or "only lines containing
       uppercase letters."  A member of this set of  strings  is  said  to  be
       matched by the regular expression.  Regular expressions or patterns are
       used to address lines in the buffer (see Addresses , above),  and  also
       for selecting strings to be replaced using the s (substitute) command.

       Where  multiple  matches  are  present  in a line, a regular expression
       matches the longest of the leftmost matching strings.

       Regular expressions can be built up from the following  "single-charac-
       ter" RE's:

       c      Any  ordinary character not listed below.  An ordinary character
              matches itself.

       \      Backslash.  When followed by a special character, the RE matches
              the "quoted" character.  A backslash followed by one of <&lt;, >&gt;, (,
              ), {, or }, represents an operator in a regular  expression,  as
              described below.

       .      Dot.  Matches any single character except NEWLINE.

       ^      As  the  leftmost  character, a caret (or circumflex) constrains
              the RE to match the leftmost portion of a line.  A match of this
              type is called an "anchored match" because it is "anchored" to a
              specific place in the line.  The ^ character loses  its  special
              meaning  if  it  appears in any position other than the start of
              the RE.

       $      As the rightmost character, a dollar sign constrains the  RE  to
              match  the  rightmost  portion of a line.  The $ character loses
              its special meaning if it appears in any position other than  at
              the end of the RE.

       ^RE$   The  construction  ^RE$  constrains  the  RE to match the entire

       \<&lt;     The sequence \<&lt; in an RE constrains the one-character RE immedi-
              ately following it only to match something at the beginning of a
              "word"; that is, either at the beginning  of  a  line,  or  just
              before  a  letter, digit, or underline and after a character not
              one of these.

       \>&gt;     The sequence \>&gt; in an RE constrains the one-character RE immedi-
              ately  following  it  only  to  match  something at the end of a

       [c...] A nonempty string of characters,  enclosed  in  square  brackets
              matches  any  single  character  in  the  string.   For example,
              [abcxyz] matches any single character  from  the  set  `abcxyz'.
              When  the first character of the string is a caret (^), then the
              RE matches any character except NEWLINE and those in the remain-
              der  of the string.  For example, `[^45678]' matches any charac-
              ter except `45678'.  A caret in any  other  position  is  inter-
              preted as an ordinary character.

              The  right square bracket does not terminate the enclosed string
              if it is the first character (after an initial `^', if any),  in
              the  bracketed  string.   In  this  position it is treated as an
              ordinary character.

       [l-r]  The minus sign, between two characters,  indicates  a  range  of
              consecutive  ASCII  characters to match.  For example, the range
              `[0-9]' is equivalent to  the  string  `[0123456789]'.   Such  a
              bracketed  string  of  characters is known as a character class.
              The `-' is treated as an ordinary character if it  occurs  first
              (or first after an initial ^) or last in the string.

       d      Delimiter character.  The character used to delimit an RE within
              a command is special for that command (for example, see how / is
              used in the g command, below).

       The  following rules and special characters allow for constructing RE's
       from single-character RE's:

              A concatenation of RE's matches a concatenation of text strings,
              each  of which is a match for a successive RE in the search pat-

       *      A single-character RE, followed by an asterisk (*) matches  zero
              or  more occurrences of the single-character RE.  Such a pattern
              is called a  closure.   For  example,  [a-z][a-z]*  matches  any
              string of one or more lower case letters.

              A  one-character  RE followed by \{m\}, \{m,\}, or \{m,n\} is an
              RE that matches a range of occurrences of the one-character  RE.
              The  values  of  m  and n must be nonnegative 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, inclusively.  Whenever a choice exists, the  RE
              matches as many occurrences as possible.

              An RE enclosed between the character sequences \( and \) matches
              whatever the unadorned RE matches, but saves the string  matched
              by  the enclosed RE in a numbered substring register.  There can
              be up to nine such substrings in an RE, and  parenthesis  opera-
              tors can be nested.

       \n     Match  the  contents of the nth substring register from the cur-
              rent RE.  This provides a mechanism for extracting matched  sub-
              strings.  For example, the expression ^\(..*\)\1$ matches a line
              consisting entirely of two adjacent non-null appearances of  the
              same  string.  When nested parenthesized substrings are present,
              n is determined by counting occurrences of \( starting from  the

       //     The null RE (//) is equivalent to the last RE encountered.

       The commands a for append, c for change, and i for insert, allow you to
       add new text to the buffer.  While accepting new text, ed is said to be
       in  input  mode.   While in input mode, no commands are recognized; all
       character input is inserted into the buffer.  To exit from input  mode,
       enter  a  dot (.) on a line by itself; ed then reverts to command mode.
       Or, you can interrupt ed (typically with CTRL-C), in which case it dis-
       plays a ?  and returns to command mode.

       Commands  may accept zero, one, or two addresses.  Commands that accept
       no addresses regard the presence of an address as an  error.   Commands
       that  accept one or two addresses assume default addresses when too few
       addresses are given; if more addresses are given than  such  a  command
       requires, only the last ones are used.

       In  the  following list of ed commands, the default addresses are shown
       in parentheses; the parenthesized addresses are not part  of  the  com-

       It  is generally illegal for more than one command to appear on a line.
       However, any command (except e, f, r, or w) may be followed by l, n, or
       p in which case the current line is either listed, numbered or printed,

       .      Append text.  Add lines  of  text  into  the  buffer  after  the
              addressed  line.  The resulting current line is the last line of
              input, or the addressed line if no text is entered.   Address  0
              is  legal  for this command, in which case the text is placed at
              the beginning of the buffer.  The maximum number  of  characters
              per  input  line  (from  a terminal) is 256, including the final

       .      Change lines.  Delete the addressed lines, and then accept lines
              of  text  to  replace them.  c accepts one or two addresses; the
              default is the current line.  The resulting current line is  the
              last  line  of input, or the line preceding the deleted lines if
              no text is entered.

       (.,.)d Delete the addressed lines from the buffer.  d  accepts  one  or
              two  addresses;  the default is the current line.  The resulting
              current line is the line following the last one deleted; if  the
              deleted  lines  were at the end of the buffer, the new last line
              is the resulting current line.

       e filename
              Edit a file.  Delete the entire contents of the buffer, and then
              read  in the named file.  The resulting current line is the last
              line of the buffer.  e reports the  number  of  characters  read
              into  the  buffer, and sets filename to be the current file (for
              use as a default filename in subsequent commands).  If no  file-
              name  is given, the current filename, if any, is used (see the f
              command, below).  If filename is replaced  by  a  shell  (sh(1))
              command  prefaced  with a `!', the shell command is executed and
              its output is read into the buffer after the current line.  Such
              a shell command is not used as the current filename.  e displays
              a ?  if the buffer has not  been  written  out  since  the  last
              change  made  --  another e command in response to the ?  forces
              the command to take effect.

       E filename
              The E command is like e, except that the editor does  not  check
              for  changes  to  the  buffer  since the last w command was per-

       f filename
              Display or set the current filename.  If filename is given as an
              argument,  the  file (f) command changes the current filename to
              filename; otherwise, it prints the current filename.

       (1,$) g/RE/command-list
              The global (g) command performs command-list on all lines in the
              range  of addresses that match RE.  ed executes command-list for
              each matching line in succession, setting the  current  line  to
              each  in turn.  command-list can contain a single command, or it
              can be continued across input lines, with  one  ed  command  per
              line,  by  escaping all but the last NEWLINE with a \ character.
              Operations that place ed into input mode (a, i, and c), are per-
              mitted  in  command-list;  the final `.'  terminating text input
              may be omitted if it is the last line of the  command-list.   g,
              G, v, and V commands, however, are not permitted.  An empty com-
              mand-list is equivalent to the p command.

       (1,$) G/RE/
              The interactive G (Global) command, selects all lines that match
              the given RE.  Then, each selected line is made current, and any
              one command (other than one of the a, c, i, g, G, v, and V  com-
              mands)  can  be  performed  upon that line.  A NEWLINE acts as a
              null command; an &&amp; reexecutes the most recent command.  Commands
              entered during execution of the G command can address and affect
              lines other than the current line.  The G command can be  termi-
              nated by an interrupt (typically CTRL-D).

       h      Help.   Display  a  short error message that explains the reason
              for the most recent ?  diagnostic.

       H      Automatic printing of help diagnostics.  Toggle between printing
              the ?  diagnostic, or automatically printing diagnostic messages
              as well.

       .      Insert Text.  Insert the given text into the buffer,  above  the
              addressed  line.  i accepts one address; the default is the cur-
              rent line.  The resulting current  line  is  the  last  line  of
              input;  if  no  text  is  input,  it is the line just before the
              addressed line.  This command differs from the a command only in
              the  placement  of  the input text; Address 0 is not allowed for
              this command.  The maximum number  of  characters  that  may  be
              entered  from  a terminal is 256 per line (including the NEWLINE

              Join Lines.  Remove the NEWLINE character from between  the  two
              addressed lines.  The defaults are the current line and the line
              following.  If exactly one address is given, this  command  does
              nothing.  The joined line is the resulting current line.

       (.)kc  Mark  the  addressed  line with the name c, a lower-case letter.
              The address-form, 'c, addresses the line marked by c.  k accepts
              one  address; the default is the current line.  The current line
              is left unchanged.

       (.,.)l List nonprinting characters.  Print the addressed  lines  in  an
              unambiguous  way:  a few nonprinting characters, such as TAB and
              BACKSPACE are represented by visually mnemonic overstrikes.  All
              other nonprinting characters are shown in octal, with long lines
              folded.  l accepts one or two addresses; the default is the cur-
              rent line.  The resulting current line is the last line printed.
              An l command may be appended to any command other than e, f,  r,
              or w.

       (.,.) maddress
              Move addressed lines to just after address.  Address 0 is legal,
              and moves the addressed line(s) to the beginning  of  the  file.
              An  error  results if address falls within the range of lines to
              move.  m accepts two addresses to specify a range  of  lines  to
              move;  the  default  is the current line.  The resulting current
              line is the last of the moved lines.

       (.,.)n Number the displayed lines.  Print the addressed lines,  preced-
              ing  each  with  its line number and a TAB character.  n accepts
              one or two addresses; the default  is  the  current  line.   The
              resulting  current line is the last line printed.  The n command
              can be appended to any command other than e, f, r, or w.

       (.,.)p Print the addressed lines.  p accepts one or two addresses;  the
              default  is the current line.  The resulting current line is the
              last line printed.  The p command may be appended to any command
              other  than  e, f, r, or w.  For example, dp deletes the current
              line and prints the new current line.

       P      Toggle prompting on or off.  When prompting is  in  effect,  the
              editor  prompts  with  a * for commands.  A subsequent P command
              turns prompting off.

       q      Quit.  Exit from ed.  Note, however,  that  the  buffer  is  not
              automatically  written  out;  you  must  write any changes to be
              saved with the w command; ed warns you  once  if  you  have  not
              saved your changes (unless the `-' option is in effect).  A sec-
              ond q forces ed to exit regardless, destroying the buffer's con-

       Q      Force quit.  This is the same as q, but you do not get any warn-
              ing if you have not previously written out the buffer.  ed  sim-
              ply exits.

       ($) r filename
              Read  in the contents of filename, after the addressed line.  If
              filename is not given, the current filename,  if  any,  is  used
              (see  the  e  and  f  commands).   The  current  filename is not
              altered; if there is no current filename, filename  becomes  the
              current  filename.   r  accepts  one  address; the default is $.
              Address 0 is legal for r, in which case the file is read  in  at
              the  beginning  of  the  buffer.  If the read is successful, the
              number of characters read is typed.  The resulting current  line
              is the last line read in from the file.  If filename is replaced
              by a shell (sh(1)) command prefaced with a !, the shell  command
              is  executed and its output is read in.  Such a shell command is
              not remembered as the current filename.

       (.,.) s/RE/rs/
       (.,.) s/RE/rs/g
       (.,.) s/RE/rs/n
              Substitute.  Search each addressed line for the first occurrence
              of  a  string matching the specified RE, and replace it with rs,
              the replacement string.  If g (global suffix) is appended to the
              command,  replace  all (non-overlapped) matching strings in each
              addressed line with the replacement string rs.  Note: the g suf-
              fix  is distinct from the g command.  If a number n is appended,
              replace only the n'th occurrence of the matched string  on  each
              addressed  line.  s accepts one or two addresses; the default is
              the current line.  The resulting current line is the  last  line
              on which a substitution is made.  An error results if RE matches
              no strings in the addressed line or range.  Any character (other
              than SPACE or NEWLINE can be used instead of / to delimit RE and
              rs.  As with RE's in addresses, you  can  refer  to  the  entire
              string matched by RE with an `&&amp;'; you can refer to parenthesized
              substrings within RE using \1...\n.  When % is the only  charac-
              ter  in rs, the rs from in the most recent substitute command is
              used as the current rs.  The % loses its special meaning when it
              is  in a replacement string of more than one character, or if it
              is preceded by a backslash.

              A line may be split by substituting a NEWLINE character into it.
              The NEWLINE in the replacement must be escaped by preceding with
              an `\'.  Such substitutions cannot be done as part of a g  or  v
              command list.

       (.,.) taddress
              Transfer.   Transpose  a copy of the addressed range of lines to
              just after the given address.  t (transfer) is  like  m  (move),
              except  that it copies of the lines, rather than moving them.  t
              accepts two addresses preceding the operation letter,  the  cur-
              rent  address is the default.  The resulting current line is the
              last line copied.  Address 0 is allowed.

       u      Undo.  Reverse the effect of the most recent command that  modi-
              fied the buffer.  A second u undoes the undo operation.

       (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
              Similar  to  the  G  command, except that the lines selected are
              those that do not match the RE.

       (1,$) w filename
              Write the addressed lines to filename.  If  the  file  does  not
              exist,  ed  creates it.  The current filename is not altered; if
              there is no current filename, then filename becomes current.  If
              no  filename is given, the current filename, if any, is used.  w
              accepts one or two addresses; the default is all  lines  in  the
              file.   The  current  line is unchanged.  If the command is suc-
              cessful, the number of  characters  written  is  displayed.   If
              filename  is replaced by a shell (sh(1)) command prefaced with a
              `!', the shell command is executed  with  standard  input  taken
              from  the  addressed  lines.  Such a shell command is not remem-
              bered as the current filename.

       (1,$) W filename
              Like w, but append the addressed lines onto the named file.

       x      Encrypt the file.  ed prompts for an  encryption  key  from  the
              standard  input.   Subsequent  e,  r, and w commands encrypt and
              decrypt the text with this key (see  crypt(1)).   An  empty  key
              turns  off  encryption.  Encryption can also be specified on the
              command line with the -x option.

       ($)=   Display the line number of the addressed line; the current  line
              remains unchanged.

              Run  a shell command.  shell-command is a (Bourne shell) command
              line.  ed replaces the unescaped character %  with  the  current
              filename;  if  a  !  appears as the first character of the shell
              command, it is replaced with the text of the previous shell com-
              mand.  (!!  repeats the last shell command.)  If any such expan-
              sion is performed, the expanded line  is  echoed.   The  current
              line is unchanged.

              An  address, alone on a line, prints the addressed line.  A NEW-
              LINE alone is equivalent to `.+1p', which 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.

   File Format Specification Support
       ed supports the fspec(5) formatting capability  for  displaying  lines.
       When the first line of a file is a format specification of the form:

              <&lt;:ts[,ts]... smax:>&gt;

       where ts is the column number of a TAB stop and max is the maximum line
       length for display purposes, and with the terminal in `stty  -tabs'  or
       `stty  tab3'  mode  (see stty(1V) for details), the indicated TAB stops
       are used in displayed lines.  While inserting text, however, TAB  stops
       are set to every eighth column.

       The  environment  variables  LC_CTYPE, LANG, and LC_default control the
       character classification throughout ed.  On entry to ed, these environ-
       ment  variables are checked in the following order: LC_CTYPE, LANG, and
       LC_default.  When a valid value is found, remaining  environment  vari-
       ables  for  character  classification  are ignored.  For example, a new
       setting for LANG does not override the current valid character  classi-
       fication  rules  of  LC_CTYPE.   When  none of the values is valid, the
       shell character classification defaults to the POSIX.1 "C" locale.

       /usr/tmp/e#         temporary; # is the process number
       ed.hup              file for saved work if the terminal is hung up

       crypt(1), ex(1), grep(1V), sed(1V), sh(1), stty(1V), vi(1),  regexp(3),
       fspec(5), locale(5), iso_8859_1(7)

       The following limitations apply:

              512 characters per line.
              256 characters per global command-list.
              1024 characters per filename.
              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 charac-
       ters after the last NEWLINE.  Files (such as  executable  images)  that
       contain  characters  not  in  the ASCII set (bit 8 on) cannot be edited
       using ed.

       If a file is not terminated by a NEWLINE character,  ed  adds  one  and
       prints a message saying that it has done so.

       If  the  closing delimiter of an RE or of a replacement string (such as
       /) would be the last character before a NEWLINE, that delimiter can  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?

       ?      For command errors.

              For an inaccessible file (use the h (help) and H (Help) commands
              for detailed explanations).

       If  changes  have  been made in the buffer since the last w command, ed
       issues a warning ?  when a command is given that would destroy the buf-
       fers contents.  A second e or q command at this point will take effect.
       The `-' and -s command-line options inhibit this feature.

       A !  command cannot be subject to a g or a v command.

       The sequence \n in an RE does not match a NEWLINE character.

       Files encrypted directly with the crypt(1) command with  the  null  key
       cannot be edited.

       The  encryption  facilities of ed are not available on software shipped
       outside the U.S.

       If the editor input is coming from a command file, the editor exits  at
       the first failure of a command in that file.

                                2 October 1989                           ED(1)