4.4 範囲アドレス

コンマ(,)で区切った2つのアドレスを指定すると、アドレス範囲を指定できます。アドレス範囲は、最初のアドレスに一致した行から始まり、2つ目のアドレスに一致した行まで(その行を含めて)一致します。

$ seq 10 | sed -n '4,6p'
4
5
6

2つ目のアドレスが regexp の場合、範囲の終端の照合は、最初のアドレスに一致した行の次の行から始まります。そのため、範囲は必ず少なくとも2行にまたがります(もちろん、入力ストリームがそこで終わる場合は除きます)。

$ seq 10 | sed -n '4,/[0-9]/p'
4
5

2つ目のアドレスが、最初のアドレスに一致した行の番号以下の number の場合、その1行だけに一致します。

$ seq 10 | sed -n '4,1p'
4

GNU sed は、特殊な2アドレス形式もサポートします。これらはいずれも GNU 拡張です。

0,/regexp/

0,/regexp/ のようなアドレス指定では、行番号 0 を使えます。これにより、sed は最初の入力行でも regexp との一致を試みます。言い換えると、0,/regexp/ は 1,/regexp/ に似ていますが、addr2 が入力の最初の行に一致した場合、0,/regexp/ 形式はそこで範囲が終わるとみなします。一方、1,/regexp/ 形式はそこで範囲が始まるとみなすため、正規表現が2回目に現れるところまで範囲が続きます。

次の例は、開始アドレスを1にした場合と0にした場合の違いを示します。

$ seq 10 | sed -n '1,/[0-9]/p'
1
2

$ seq 10 | sed -n '0,/[0-9]/p'
1
addr1,+N

addr1 と、addr1 に続く N 行に一致します。

$ seq 10 | sed -n '6,+2p'
6
7
8

addr1 は行番号または正規表現にできます。

addr1,~N

addr1 と、addr1 の後の行から、入力行番号が次に N の倍数になる行までに一致します。次のコマンドは、6行目から、次に4の倍数になる行(つまり8行目)までを表示します。

$ seq 10 | sed -n '6,~4p'
6
7
8

addr1 は行番号または正規表現にできます。