Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ ed(C) — OpenDesktop 1.0.0y

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

coltbl(M)

grep(C)

locale(M)

sed(C)

sh(C)

stty(C)

regexp(S)


     ED(C)                                      UNIX System V



     Name
          ed, red - invokes the text editor


     Syntax
          ed [ - ] [ -p string ] [ file ]

          red [ 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.  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(C).  It  will  only  allow
          editing  of  files  in  the current directory.  It prohibits
          executing sh(C) commands via the ! command. red displays  an
          error message on any attempt to bypass these restrictions.

          In general, red does not allow commands like

               !date

          or

               !sh

          Furthermore, red will not allow  pathnames  in  its  command
          line.   For example, the command:

               red /etc/passwd

          when the current directory is not /etc causes an error.


     Options
          The options to ed are:

          -    Suppresses the printing of character counts by  the  e,
               r,  and  w  commands,  of  diagnostics  from  e  and  q
               commands, and the ! prompt after a !shell command.

          -p   Allows the user to specify a prompt string.

          ed supports 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(C)),
          the  specified  tab  stops  will  automatically be used when
          scanning file.  For example, if the first  line  of  a  file
          contained:

               <:t5,10,15 s72:>

          tab stops would be set at columns  5,  10,  and  15,  and  a
          maximum  line  length  of  72 would be imposed.  NOTE: While
          inputing text, tab characters are expanded to  every  eighth
          column as 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 entering 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 specifies
          a set of character strings.  A member of this set of strings
          is  said  to  be  matched  by  the  regular expression.  The
          regular  expressions  allowed  by  ed  are  constructed   as
          follows:

          The following  one-character  regular  expressions  match  a
          single character:

          1.1    An ordinary character (not one of those discussed  in
                 1.2 below) is a one-character regular expression that
                 matches itself.

          1.2    A backslash (\) followed by any special character  is
                 a  one-character  regular expression that matches the
                 special character  itself.   The  special  characters
                 are:

                 a.    ., *, [, and \ (dot, star, left square bracket,
                       and   backslash,   respectively),   which   are
                       otherwise  special,  except  when  they  appear
                       within square brackets ([]); see 1.4 below).

                 b.    ^ (caret), which is special at the beginning of
                       an  entire  regular expression (see 3.1 and 3.2
                       below), or when it immediately follows the left
                       of  a  pair  of  square  brackets ([]) (see 1.4
                       below).

                 c.    $ (dollar sign), which is special at the end of
                       an entire regular expression (see 3.2 below).

                 d.    The character used to bound (i.e., delimit)  an
                       entire regular expression, which is special for
                       that regular expression (for example,  see  how
                       slash (/) is used in the g command below).

          1.3    A period (.) is a  one-character  regular  expression
                 that matches any character except newline.

          1.4    A nonempty string of characters  enclosed  in  square
                 brackets  ([])  is a one-character regular expression
                 that matches any one character in that  string.   If,
                 however, the first character of the string is a caret
                 (^), the one-character regular expression matches any
                 character except newline and the remaining characters
                 in the string.  The star (*) also  has  this  special
                 meaning  only  if it occurs first in the string.  The
                 dash  (-)  may  be  used  to  indicate  a  range   of
                 consecutive  ASCII  characters; for example, [0-9] is
                 equivalent to [0123456789].  The dash (-) loses  this
                 special  meaning if it occurs first (after an initial
                 caret (^), 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  caret  (^),  if  any);  e.g., []a-f] matches
                 either a right square  bracket  (])  or  one  of  the
                 letters  ``a''  through  ``f'' inclusive.  Dot, star,
                 left bracket, and the backslash  lose  their  special
                 meaning within such a string of characters.

          Ranges of characters (characters separated by -) are treated
          according  to  the  current locale's collation sequence (see
          locale(M)).  Therefore, if the collation sequence in use  is
          A, a, B, b, C, c, then the expression [a-d] is equivalent to
          the expression [aBbCcDd].

          To specify a collation item within a class, the item must be
          enclosed  between [. and .].  Two character to one collation
          item mappings must be specified this way.  For  example,  if
          the  current  collation  rules  specify  that the characters
          ``Ch'' map to one character for collation  purposes  (as  in
          Spanish),  then  this  collation  item would be specified as
          [.Ch.].

          To specify a group of collation items, which are  classified
          as equal unless all other collation items in the string also
          match,  in  which  case  a  secondary   ``weight''   becomes
          significant,  a single member of that group must be enclosed
          between [= and =].  For example, if the characters A  and  a
          are  in  the same group then the class expressions [[=a=]b],
          [[=A=]b] and [Aab] are all equivalent.

          The ctype classes  can  also  be  specified  within  regular
          expressions.   These  are  enclosed  between [: and :].  The
          possible ctype classes are:

          [:alpha:]   Matches alphabetic characters
          [:upper:]   Matches upper case characters
          [:lower:]   Matches lower case characters
          [:digit:]   Matches digits
          [:alnum:]   Matches alphanumeric characters
          [:space:]   Matches white space
          [:print:]   Matches printable characters
          [:punct:]   Matches punctuation marks
          [:graph:]   Matches graphical characters
          [:cntrl:]   Matches control characters

          The  following  rules  may  be  used  to  construct  regular
          expressions from one-character regular expressions:

          2.1  A one-character regular expression followed by  a  star
               (*)  is  a regular expression that matches zero or more
               occurrences of the  one-character  regular  expression.
               If  there  is  any  choice, the longest leftmost string
               that permits a match is chosen.

          2.2  A one-character regular expression followed  by  \{m\},
               \{m,\}, or \{m,n\} is a regular expression that matches
               a range of occurrences  of  the  one-character  regular
               expression.   The values of m and n must be nonnegative
               integers  less  than  255;  \{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 regular
               expression matches as many occurrences as possible.

          2.3  The concatenation of regular expressions is  a  regular
               expression   that  matches  the  concatenation  of  the
               strings  matched  by  each  component  of  the  regular
               expression.

          2.4  A regular expression  enclosed  between  the  character
               sequences  \(  and  \)  is  a  regular  expression that
               matches  whatever  the  unadorned  regular   expression
               matches.  See 2.6 below for a discussion of why this is
               useful.

          2.5  The expression \n matches the same string of characters
               as was matched by an expression enclosed between \( and
               \) earlier in the same regular expression.  Here n is a
               digit;  the  subexpression  specified is that beginning
               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.

          Finally, an entire regular expression may be constrained  to
          match only an initial segment or final segment of a line (or
          both):

          3.1    A caret (^) at the beginning  of  an  entire  regular
                 expression  constrains  that  regular  expression  to
                 match an initial segment of a line.

          3.2    A dollar sign ($) at the end  of  an  entire  regular
                 expression  constrains  that  regular  expression  to
                 match a final segment of a  line.   The  construction
                 ^entire  regular  expression$  constrains  the entire
                 regular expression to match the entire line.

          The null regular expression (e.g., //) is equivalent to  the
          last regular expression encountered.

          To understand addressing in ed , it  is  necessary  to  know
          that  there  is  a  current  line  at  all  times. Generally
          speaking, the current line is the last line  affected  by  a
          command;  the  exact effect on the current line is discussed
          under  the  description  of  each  command.   Addresses  are
          constructed as follows:

           1.    The character . addresses the current line.

           2.    The character  $  addresses  the  last  line  of  the
                 buffer.

           3.    A decimal number n addresses the  n-th  line  of  the
                 buffer.

           4.    'x addresses the  line  marked  with  the  mark  name
                 character x, which must be a lowercase letter.  Lines
                 are marked with the k command described below.

           5.    A  regular  expression  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 regular  expression.
                 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.

           6.    A regular expression enclosed in question  marks  (?)
                 addresses  the first line found by searching backward
                 from the line preceding the current line  toward  the
                 beginning  of  the  buffer  and stopping at the first
                 line  containing  a  string  matching   the   regular
                 expression.  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,  respectively.   As a
                 consequence of this rule and of  rule  8  immediately
                 above, the address - refers to the line preceding the
                 current  line.   (To  maintain   compatibility   with
                 earlier  versions  of  the editor, the character ^ in
                 addresses is entirely  equivalent  to  -.)  Moreover,
                 trailing + and - characters have a cumulative effect,
                 so -- refers to the current line less 2.

          10.    For convenience, a comma (,) stands for  the  address
                 pair  1,$,  while a semicolon (;) stands for the pair
                 .,$.

          Commands may require zero, one, or two addresses.   Commands
          that  require no addresses regard the presence of an address
          as an error.  Commands that  accept  one  or  two  addresses
          assume  default  addresses  when  an  insufficient number of
          addresses is given; if more addresses are given than such  a
          command requires, the last address(es) are used.

          Typically, addresses are separated  from  each  other  by  a
          comma  (,).   They may also be separated by a semicolon (;).
          In the latter case, the current line (.) is set to the first
          address,  and  only  then  is the second address calculated.
          This feature can be used to determine the starting line  for
          forward  and  backward  searches  (see rules 5 and 6 above).
          The  second  address  of  any  two-address   sequence   must
          correspond  to  a line that follows, in the buffer, the line
          corresponding to the first address.

          In the following list of ed commands, the default  addresses
          are  shown  in parentheses.  The parentheses are not part of
          the address.

          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 suffixed by p or by l, in which case the current line  is
          either  printed  or listed, respectively, as discussed below
          under the p and l commands.

          (.)a
          <text>
          .
               The append command reads the given text and appends  it
               after the addressed line; dot is left at the address of
               the last inserted line, or, if there were  no  inserted
               lines,  at  the addressed line.  Address 0 is legal for
               this command: it causes the  ``appended''  text  to  be
               placed at the beginning of the buffer.

          (.)c
          <text>
          .
               The change command deletes the  addressed  lines,  then
               accepts  input  text  that replaces these lines; dot is
               left at the address of the  last  line  input,  or,  if
               there  were  none,  at  the  first  line  that  was not
               deleted.

          (.,.)d
               The delete command deletes the addressed lines from the
               buffer.   The  line after the last line deleted becomes
               the current line; if the lines deleted were  originally
               at the end of the buffer, the new last line becomes the
               current line.

          e file
               The edit command causes  the  entire  contents  of  the
               buffer  to  be  deleted,  and then the named file to be
               read in; dot is set to the last line of the buffer.  If
               no   filename   is   given,  the  currently  remembered
               filename, if any, is used (see  the  f  command).   The
               number of characters read is typed.  file is remembered
               for possible use as a default filename in subsequent e,
               r,  and w commands.  If file begins with an exclamation
               (!), the rest of the  line  is  taken  to  be  a  shell
               command.  The  output of this command is read for the e
               and r commands.  For the w command, the file is used as
               the  standard  input for the specified command.  Such a
               shell  command  is  not  remembered  as   the   current
               filename.

          E file
               The Edit command is like e, except 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  filename  command  changes  the
               currently  remembered  filename  to file; otherwise, it
               prints the currently remembered filename.

          (1,$)g/regular-expression/command list
               In the global command, the first step is to mark  every
               line  that matches the given regular expression.  Then,
               for every such line, the given command list is executed
               with . initially set to that line.  A single command or
               the first of a list of commands  appears  on  the  same
               line  as  the global command.  All lines of a multiline
               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 Notes and the last paragraph before Files below.

          (1,$)G/regular-expression/
               In the interactive Global command, the first step is to
               mark   every   line  that  matches  the  given  regular
               expression.  Then, for every such line,  that  line  is
               printed,  dot  (.) is changed to that line, and any one
               command (other than one of the a, c, i, g, G, v, and  V
               commands)  may  be  input  and  is executed.  After the
               execution of that command,  the  next  marked  line  is
               printed,  and so on.  A newline acts as a null command.
               An ampersand (&) 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 entering an INTERRUPT (pressing the DEL key).

          h
               The help command  gives  a  short  error  message  that
               explains the reason for the most recent ? diagnostic.

          H
               The Help command causes ed to enter  a  mode  in  which
               error   messages  are  printed  for  all  subsequent  ?
               diagnostics.   It  will  also  explain   the   previous
               diagnostic 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; dot is left at the address of the last
               inserted line, or if there were no inserted  lines,  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.

          (.,.+1)j
               The join command joins contiguous lines by removing the
               appropriate newline characters.  If only one address is
               given, this command does nothing.

          (.)kx
               The mark command marks the addressed line with name  x,
               which  must be a lowercase letter.  The address 'x then
               addresses this line.  Dot is unchanged.

          (.,.)l
               The list command  prints  the  addressed  lines  in  an
               unambiguous  way:  a  few nonprinting characters (e.g.,
               tab,   backspace)   are   represented    by    mnemonic
               overstrikes,   all  other  nonprinting  characters  are
               printed in octal, and long  lines  are  folded.   An  l
               command may be appended to any 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 causes the addressed line(s) to be moved  to  the
               beginning  of  the  file.   It is an error if address a
               falls within the range of moved lines.  Dot 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.  Dot is left at the last line printed.   The
               n  command may be appended to any command other than e,
               f, r, or w.

          (.,.)p
               The print command prints the addressed lines.   Dot  is
               left  at  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
               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.

          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 filename is given, the currently
               remembered filename, if any,  is  used  (see  e  and  f
               commands).   The  currently  remembered filename is not
               changed  unless  file  is  the  very   first   filename
               mentioned since ed was invoked.  Address 0 is legal for
               r and causes the file to be read at  the  beginning  of
               the  buffer.   If the read is successful, the number of
               characters read is typed.  Dot is set to the address of
               the last line read in.  If file begins with !, the rest
               of the line is taken to be a shell command whose output
               is  to be read.  Such a shell command is not remembered
               as the current filename.

          (.,.)s/regular-expression/replacement/ or

          (.,.)s/regular-expression/replacement/g or

          (.,.)s/regular-expression/replacement/n n=1-512

               The substitute command searches each addressed line for
               an  occurrence of the specified regular expression.  In
               each line in which a match is found, all  nonoverlapped
               matched  strings  are  replaced  by  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.
               It  is  an  error  for  the substitution to fail on all
               addressed lines.  Any character  other  than  space  or
               newline  may  be  used instead of / to delimit regular-
               expression and replacement.  Dot is left at the address
               of the last line on which a substitution occurred.

               The n character represents any number between  one  and
               512.  This number indicates the instance of the pattern
               to be replaced on each addressed line.

               An ampersand (&) appearing in replacement  is  replaced
               by  the  string  matching the regular-expression on the
               current line.  The special meaning of the ampersand  in
               this  context  may be suppressed by preceding it with a
               backslash.  The characters \n, where n is a digit,  are
               replaced  by  the  text  matched  by  the  n-th regular
               subexpression  of  the  specified  regular   expression
               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  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 when
               it is preceded by a \.

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

          (.,.)ta
               This command acts just like the m command, except  that
               a copy of the addressed lines is placed after address a
               (which may be 0).  Dot is left at the  address  of  the
               last line of the copy.

          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/regular-expression/command list
               This command is the same as the global command g except
               that  the  command  list is executed with dot initially
               set to every line  that  does  not  match  the  regular
               expression.

          (1,$)V/regular-expression/
               This command is the  same  as  the  interactive  global
               command  G except that the lines that are marked during
               the first step are those that do not match the  regular
               expression.

          (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  writeable  by  everyone),
               unless   the   umask   setting   (see  sh(C))  dictates
               otherwise.  The currently remembered  filename  is  not
               changed   unless   file  is  the  very  first  filename
               mentioned since ed was  invoked.   If  no  filename  is
               given,  the  currently  remembered filename, if any, is
               used (see e and f commands), and dot remains.   If  the
               command is successful, the number of characters written
               is displayed.  If file begins with an exclamation  (!),
               the  rest of the line is taken to be a shell command to
               which the addressed lines are supplied as the  standard
               input.   Such  a shell command is not remembered as the
               current filename.

          ($)=
               The line number of the addressed line is typed.  Dot is
               unchanged by this command.

          !shell command
               The remainder of the line after the ! is  sent  to  the
               UNIX  shell  (sh(C))  to  be  interpreted as a command.
               Within  the  text  of  that  command,   the   unescaped
               character  %  is replaced with the remembered filename.
               If a ! appears as the  first  character  of  the  shell
               command,  it  is replaced with the text of the previous
               shell command.  Thus, !! will  repeat  the  last  shell
               command.   If  any expansion is performed, the expanded
               line is echoed.  Dot is unchanged.

          (.+1)
               An address alone on a line causes the addressed line to
               be  printed.  A RETURN alone on a line is equivalent to
               .+1p. This is useful for stepping forward  through  the
               editing buffer a line at a time.

          If an interrupt signal (ASCII DEL  or  BREAK)  is  sent,  ed
          prints a question mark (?) and returns to its command level.

          ed has  size  limitations:  512  characters  per  line,  256
          characters  per  global  command  list,  64  characters  per
          filename, and 128K characters in the buffer.  The  limit  on
          the number of lines depends on the amount of user memory.

          When reading a file, ed discards ASCII  NUL  characters  and
          all  characters after the last newline.  Files (e.g., a.out)
          that contain characters not in the  ASCII  set  (bit  8  on)
          cannot be edited by ed.

          If the closing delimiter of a regular  expression  or  of  a
          replacement  string  (e.g.,  /)  would be the last character
          before a newline, that delimiter may be  omitted,  in  which
          case  the  addressed  line  is printed.  Thus, 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


     See Also
          coltbl(M),  grep(C),  locale(M),  sed(C),  sh(C),   stty(C),
          regexp(S)


     Diagnostics
          ?      Command errors
          ? file 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 by printing ? and allowing you to continue editing.
          A second e or q command at this point will take effect.  The
          dash (-) command-line option inhibits this feature.


     Notes
          An exclamation (!) 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(C)).

          The sequence \n in a regular expression does not  match  any
          character.

          The l command mishandles DEL.

          Because 0 is an illegal address for the w command, it is not
          possible to create an empty file with ed.

          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 the command file.


     Standards Conformance
          ed is conformant with:

          AT&T SVID Issue 2, Select Code 307-127;
          and The X/Open Portability Guide II of January 1987.


     (printed 8/28/89)                                  ED(C)

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026