分岐コマンドb、t、Tを使うと、sedプログラムの処理の流れを変更できます。
既定では、sedは入力行をパターンバッファーへ読み込み、その後、すべてのコマンドを順番に処理します。アドレスのないコマンドはすべての行に作用します。アドレスのあるコマンドは、一致する行だけに作用します。sedの動作とアドレスの概要を参照してください。
sedには、典型的なif/then構文はありません。代わりに、一部のコマンドを条件として使ったり、既定の処理の流れを変更したりできます。
d現在のパターンスペースを削除(消去)し、残りのコマンドを処理せず、パターンスペースも表示せずに、プログラムのサイクルを再開します。
Dパターンスペースの内容を最初の改行まで削除し、残りのコマンドを処理せず、パターンスペースも表示せずに、プログラムのサイクルを再開します。
[addr]X[addr]{ X ; X ; X }/regexp/X/regexp/{ X ; X ; X }アドレスと正規表現は、if/thenの条件として使えます。[addr]が現在のパターンスペースに一致すれば、コマンドを実行します。たとえば、コマンド/^#/dは、もし現在のパターンが正規表現^#(ハッシュ記号で始まる行)に一致すれば、そのときdコマンドを実行する、という意味です。つまり、行を表示せずに削除し、プログラムのサイクルを直ちに再開します。
b無条件で分岐します。つまり、新しいサイクルを再開せず、常にラベルへ移動して、ほかのコマンドを飛ばしたり繰り返したりします。アドレスと組み合わせると、一致する行に対して条件付きで分岐できます。
t最後に入力行を読んだ後、または別の条件分岐を実行した後に、s///コマンドが成功した場合だけ、条件付きで分岐します(つまりラベルへ移動します)。
Ttコマンドと似ていますが、条件は逆です。最後に入力行を読んだ後に、成功した置換がない場合だけ分岐します。
次の2つのsedプログラムは同じ動作をします。最初の(説明のために作った)例では、bコマンドを使い、「1」を含む行でs///コマンドを飛ばします。2つ目の例では、否定(「!」)付きのアドレスを使い、対象の行だけで置換を行います。y///コマンドは、どちらの場合もすべての行で実行されます。
$ printf '%s\n' a1 a2 a3 | sed -E '/1/bx ; s/a/z/ ; :x ; y/123/456/' a4 z5 z6 $ printf '%s\n' a1 a2 a3 | sed -E '/1/!s/a/z/ ; y/123/456/' a4 z5 z6