6.4.2 分岐の例:行の結合

分岐を使う実際的な例として、電子メールの符号化によく使われるquoted-printableファイルを考えます。この形式では、長い行を分割し、行末の1つの「=」文字からなるソフト改行で示します。

$ cat jaques.txt
All the wor=
ld's a stag=
e,
And all the=
 men and wo=
men merely =
players:
They have t=
heir exits =
and their e=
ntrances;
And one man=
 in his tim=
e plays man=
y parts.

次のプログラムは、アドレスの一致「/=$/」を条件として使います。現在のパターンスペースの末尾が「=」なら、Nで次の入力行を読み、後に改行が続くすべての「=」文字を置換し、新しいサイクルを再開せずに、無条件でプログラムの先頭へ分岐します(b)。パターンスペースの末尾が「=」でなければ、既定の処理を行います。パターンスペースを表示し、新しいサイクルを開始します。

$ sed ':x ; /=$/ { N ; s/=\n//g ; bx }' jaques.txt
All the world's a stage,
And all the men and women merely players:
They have their exits and their entrances;
And one man in his time plays many parts.

少し異なる方法の別のプログラムを示します。最後の行を除くすべての行で、Nがその行をパターンスペースへ追加します。その後、置換コマンドが、行末の「=」(つまり後に改行が続くもの)であるソフト改行を空文字列へ置換し、取り除きます。置換が成功した場合(つまりパターンスペースに結合すべき行があった場合)、条件分岐コマンドtが、サイクルを完了・再開せずにプログラムの先頭へ移動します。置換が失敗した場合(つまりソフト改行がなかった場合)、tコマンドは分岐しません。その後、Pがパターンスペースの最初の改行までの内容を表示し、Dがパターンスペースの最初の改行までの内容を削除します(N、P、Dコマンドの詳細は、複数行を扱う手法:D,G,H,N,Pによる複数行の処理を参照してください)。

$ sed ':x ; $!N ; s/=\n// ; tx ; P ; D' jaques.txt
All the world's a stage,
And all the men and women merely players:
They have their exits and their entrances;
And one man in his time plays many parts.

行を結合するほかの例については、行の結合を参照してください。