2.6.1 行グループ書式
行グループ書式を使うと、プログラミング言語やテキスト整形言語など、if-then-elseの入力を受け付ける多くの用途に適した書式を指定できます。行グループ書式は、同じ種類の行が連続するグループに対する出力書式を指定します。
たとえば、次のコマンドはTeXファイルoldとnewを比較して、マージされたファイルを出力します。古い領域は「\begin{em}」と「\end{em}」の行で囲まれ、新しい領域は「\begin{bf}」と「\end{bf}」の行で囲まれます。
diff \
--old-group-format='\begin{em}
%<\end{em}
' \
--new-group-format='\begin{bf}
%>\end{bf}
' \
old new
次のコマンドは上の例と同じですが、既定の行グループ書式を明記しているため、少し長くなっています。
diff \
--old-group-format='\begin{em}
%<\end{em}
' \
--new-group-format='\begin{bf}
%>\end{bf}
' \
--unchanged-group-format='%=' \
--changed-group-format='\begin{em}
%<\end{em}
\begin{bf}
%>\end{bf}
' \
old new
次はさらに高度な例です。行番号を含むヘッダーを、平易な英語の表現で付けた差分一覧を出力します。
diff \ --unchanged-group-format='' \ --old-group-format='-------- %dn line%(n=1?:s) deleted at %df: %<' \ --new-group-format='-------- %dN line%(N=1?:s) added after %de: %>' \ --changed-group-format='-------- %dn line%(n=1?:s) changed at %df: %<-------- to: %>' \ old new
行グループ書式を指定するには、diffを以下のいずれかのオプションとともに使います。各種類の行グループに1つずつ、最大4つの書式を指定できます。formatには通常シェルのメタ文字が含まれるため、引用符で囲んでください。
- --old-group-format=format
これらの行グループは、最初のファイルの行だけを含むhunkです。古いグループの既定の書式は、変更グループ書式が指定されていればそれと同じです。指定されていなければ、行グループをそのまま出力する書式になります。
- --new-group-format=format
これらの行グループは、2番目のファイルの行だけを含むhunkです。新しいグループの既定の書式は、変更グループ書式が指定されていればそれと同じです。指定されていなければ、行グループをそのまま出力する書式になります。
- --changed-group-format=format
これらの行グループは、両方のファイルの行を含むhunkです。変更グループの既定の書式は、古いグループ書式と新しいグループ書式を連結したものです。
- --unchanged-group-format=format
これらの行グループは、両方のファイルに共通する行を含みます。未変更グループの既定の書式は、行グループをそのまま出力する書式です。
行グループ書式では、通常の文字はその文字自身を表します。変換指定は「%」で始まり、次のいずれかの形になります。
- ‘%<’
最初のファイルの行を、末尾の改行も含めて表します。各行は古い行書式に従って整形されます(行書式を参照)。
- ‘%>’
2番目のファイルの行を、末尾の改行も含めて表します。各行は新しい行書式に従って整形されます。
- ‘%=’
両方のファイルに共通する行を、末尾の改行も含めて表します。各行は未変更行書式に従って整形されます。
- ‘%%’
「%」を表します。
- ‘%c'C'’
Cが1文字であるとき、Cを表します。Cはバックスラッシュやアポストロフィにはできません。たとえば「%c':'」はコロンを表します。通常ならコロンで終わるif-then-else書式のthen部分の中でも使えます。
- ‘%c'\O'’
Oが1〜3桁の8進数字の文字列であるとき、8進コードOを持つ文字を表します。たとえば「%c'\0'」はヌル文字を表します。
- ‘Fn’
Fが
printfの変換指定で、nが以下のいずれかの文字であるとき、nの値をFで整形して表します。- ‘e’
古いファイルで、グループの直前にある行の行番号です。
- ‘f’
古いファイルで、グループの最初の行の行番号です。e + 1と同じです。
- ‘l’
古いファイルで、グループの最後の行の行番号です。
- ‘m’
古いファイルで、グループの直後にある行の行番号です。l + 1と同じです。
- ‘n’
古いファイルで、グループに含まれる行数です。l - f + 1と同じです。
- ‘E, F, L, M, N’
新しいファイルの行について、同様に表します。
printfの変換指定には「%d」、「%o」、「%x」、「%X」を使え、それぞれ10進、8進、小文字の16進、大文字の16進の出力を指定します。「%」の後には、0個以上のフラグ、最小フィールド幅を指定する整数、ピリオドとそれに続く省略可能な整数で指定する最小桁数を、この順で置けます。フラグには、左寄せの「-」、ロケールカテゴリーLC_NUMERICで指定されたグループへの桁区切りを行う「'」、スペースの代わりにゼロで埋める「0」があります。たとえば「%5dN」は、新しいファイルでグループに含まれる行数を、printf書式"%5d"を使って幅5文字のフィールドに出力します。- ‘(A=B?T:E)’
AとBが等しければT、そうでなければEです。AとBはそれぞれ、10進定数か、上で説明したように解釈される1文字です。この書式指定は、Aの値とBの値が等しければTと、それ以外ならEと同じになります。
たとえば「%(N=0?no:%dN) line%(N=1?:s)」は、N(新しいファイルでグループに含まれる行数)が0なら「no lines」、Nが1なら「1 line」、それ以外なら「%dN lines」と同じになります。