6.4.1 分岐とサイクル

b、t、Tコマンドの後にはラベルを指定できます(通常は1つの字母です)。ラベルは、コロンの後に1つ以上の字母を続けて定義します(たとえば「:x」)。ラベルを省略した場合、分岐コマンドはサイクルを再開します。ラベルへの分岐とサイクルの再開の違いに注意してください。サイクルを再開すると、sedはまずパターンスペースの現在の内容を表示し、その後、次の入力行をパターンスペースへ読み込みます。ラベルへ移動する場合は、たとえそのラベルがプログラムの先頭にあっても、パターンスペースを表示せず、次の入力行も読み込みません。

次のプログラムは何も変更しません。プログラム中の唯一のコマンドであるbコマンドにはラベルがないため、単にサイクルを再開します。各サイクルで、パターンスペースを表示し、次の入力行を読み込みます。

$ seq 3 | sed b
1
2
3

次の例は無限ループです。終了せず、何も表示しません。bコマンドは「x」ラベルへ移動し、新しいサイクルは開始されません。

$ seq 3 | sed ':x ; bx'

# The above command requires gnu sed (which supports additional
# commands following a label, without a newline). A portable equivalent:
#     sed -e ':x' -e bx

分岐は、nやNコマンドと組み合わせることがよくあります。どちらも、サイクルの再開を待たずに次の入力行をパターンスペースへ読み込みます。次の入力行を読む前に、nは現在のパターンスペースを表示してから空にします。一方、Nは改行と次の入力行をパターンスペースへ追加します。

次の2つの例を考えてみます。

$ seq 3 | sed ':x ; n ; bx'
1
2
3

$ seq 3 | sed ':x ; N ; bx'
1
2
3