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.