このページの内容

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」と同じになります。