ed: Line addressing

 
 4 Line addressing
 *****************
 
 An address represents the number of a line in the buffer. '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 address of the last line of the
 file. In general, the current address is set to the address of the last
 line affected by a command.
 
    One exception to the rule that addresses represent line numbers is
 the address '0' (zero). This means "before the first line", and is
 valid wherever it makes sense.
 
    An address range is two addresses separated either by a comma (',')
 or a semicolon (';'). In a semicolon-delimited range, the current
 address ('.') is set to the first address before the second address is
 calculated. This feature can be used to set the starting line for
 searches. The value of the first address in a range cannot exceed the
 value of the second.
 
    Addresses can be omitted on either side of the comma or semicolon
 separator. If only the first address is given in a range, then the
 second address is set to the given address. If only the second address
 is given, the resulting address pairs are '1,addr' and '.;addr'
 respectively. If a N-tuple of addresses is given where N > 2, then the
 corresponding range is determined by the last two addresses in the
 N-tuple. If only one address is expected, then the last address is
 used. It is an error to give any number of addresses to a command that
 requires zero addresses.
 
    A line address is constructed as follows:
 
 '.'
      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,$'.
 
 '+N'
      The Nth next line, where N is a non-negative number.
 
 '-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.
 
 '-'
      The previous line. This is equivalent to '-1' and may be repeated
      with cumulative effect.
 
 ','
      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. A null RE '//' 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. A null RE '??' repeats the last search.
 
 ''x'
      The apostrophe-x character pair addresses the line previously
      marked by a 'k' (mark) command, where 'x' is a lower case letter
      from the portable character set.
 
 
    Addresses can be followed by one or more address offsets, optionally
 separated by whitespace. Offsets are constructed as follows:
 
    * '+' or '-' followed by a number adds or subtracts the indicated
      number of lines to or from the address.
 
    * '+' or '-' not followed by a number adds or subtracts 1 to or from
      the address.
 
    * A number adds the indicated number of lines to the address.
 
 
    It is not an error if an intermediate address value is negative or
 greater than the address of the last line in the buffer. It is an error
 if the final address value is negative or greater than the address of
 the last line in the buffer. It is an error if a search for a RE fails
 to find a matching line.