sed: Range Addresses

 
 4.4 Range Addresses
 ===================
 
 An address range can be specified by specifying two addresses separated
 by a comma (',').  An address range matches lines starting from where
 the first address matches, and continues until the second address
 matches (inclusively):
 
      $ seq 10 | sed -n '4,6p'
      4
      5
      6
 
    If the second address is a REGEXP, then checking for the ending match
 will start with the line _following_ the line which matched the first
 address: a range will always span at least two lines (except of course
 if the input stream ends).
 
      $ seq 10 | sed -n '4,/[0-9]/p'
      4
      5
 
    If the second address is a NUMBER less than (or equal to) the line
 matching the first address, then only the one line is matched:
 
      $ seq 10 | sed -n '4,1p'
      4
 
    GNU 'sed' also supports some special two-address forms; all these are
 GNU extensions:
 '0,/REGEXP/'
      A line number of '0' can be used in an address specification like
      '0,/REGEXP/' so that 'sed' will try to match REGEXP in the first
      input line too.  In other words, '0,/REGEXP/' is similar to
      '1,/REGEXP/', except that if ADDR2 matches the very first line of
      input the '0,/REGEXP/' form will consider it to end the range,
      whereas the '1,/REGEXP/' form will match the beginning of its range
      and hence make the range span up to the _second_ occurrence of the
      regular expression.
 
      Note that this is the only place where the '0' address makes sense;
      there is no 0-th line and commands which are given the '0' address
      in any other way will give an error.
 
      The following examples demonstrate the difference between starting
      with address 1 and 0:
 
           $ seq 10 | sed -n '1,/[0-9]/p'
           1
           2
 
           $ seq 10 | sed -n '0,/[0-9]/p'
           1
 
 'ADDR1,+N'
      Matches ADDR1 and the N lines following ADDR1.
 
           $ seq 10 | sed -n '6,+2p'
           6
           7
           8
 
      ADDR1 can be a line number or a regular expression.
 
 'ADDR1,~N'
      Matches ADDR1 and the lines following ADDR1 until the next line
      whose input line number is a multiple of N.  The following command
      prints starting at line 6, until the next line which is a multiple
      of 4 (i.e.  line 8):
 
           $ seq 10 | sed -n '6,~4p'
           6
           7
           8
 
      ADDR1 can be a line number or a regular expression.