Next: , Up: If-then-else


2.6.1 行のグループを使用した書式

行のグループを使用した書式で,プログラミング言語とテキストの書式化言語が 含まれる,if-then-elseの入力が可能な多くのアプリケーションに適した書式を 指定することができます.行のグループを使用した書式で,類似した行の連続し たグループに対して出力書式を指定します.

例えば,以下のコマンドで,TeXファイルのoldnewを比較し, 古い領域の周りに‘\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

以下はより高度な例で,“plain English”形式の行番号を含むヘッダを用いて 差分リストを出力します.

     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

行のグループを使用した書式を指定するために,以下でリストアップするオプショ ンの一つを使用してください.行のグループを使用した書式のうち四つまで指定 することが可能で,それぞれの行のグループの種類になります.通常 formatはシェルのメタ文字を含んでいるので,引用符で囲むべきです.

--old-group-format=format
これらの行のグループは,最初のファイルの行だけに含まれているhunkです.デ フォルトの古いグループの書式は,指定されている場合は変更されたグループの 書式と同じです.それ以外の場合,行のグループはそのまま出力される書式にな ります.
--new-group-format=format
これらの行のグループは,二番目のファイルの行だけに含まれているhunkです. デフォルトの新しいグループの書式は,指定されている場合は変更されたグルー プの書式と同じです.それ以外の場合,行のグループはそのまま出力される書式 になります.
--changed-group-format=format
これらの行のグループは,両方のファイルの行を含んでいるhunkです.デフォル トで,変更されたグループの書式は,新旧のグループの書式を連結したものにな ります.
--unchanged-group-format=format
これらの行のグループは,両方のファイルに共通な行を含んでいます.デフォル トで,変更されていないグループの書式は,行のグループをそのまま出力する書 式です.

行のグループを使用した書式では,通常の文字はそのまま表示されます.伝統的 な仕様は,‘%’で開始し以下の形式の一つが続きます.

%<
最初のファイルからの行を意味し,それは最後の改行を含めます.それぞれの行 は,古い行の書式に依存して書式化されます(see Line Formats).
%>
二番目のファイルからの行を意味し,それは最後の改行を含めます.それぞれの 行は,新しい行の書式に依存して書式化されます.
%=
両方のファイルに共通な行を意味し,それは最後の改行を含めます.それぞれの 行は,変更されていない行の書式に依存して書式化されます.
%%
%’を意味します.
%c'C'
このCは単一文字で,Cを意味します.Cをバックスラッシュ やアポストロフィーにしてはいけません.例えば,‘%c':'’はコロンを意味 し,if-then-else書式のthen-part内部ではコロンは通常終端文字ですが,その ままの意味になります.
%c'\O'
このOは,1桁,2桁,または3桁の八進数で,8ビットコードOの文字 を意味します.例えば,‘%c'\0'’はヌル文字を意味します.
Fn
このFは,printfの変換を指定し,nは以下の文字の一つに なり,Fで書式化されるnの値を意味します.
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進数の出力を指定します.‘%’の後に続くオプションを順番に表します. ゼロ以上のフラグの列.最小フィールド幅の整数.そして,ピリオドに続く桁数 の最小値を指定する追加の整数.フラグは,左寄せに対する‘-’, LC_NUMERICロケールのカテゴリで指定される,グループごとの桁数に分離 する‘'’,そして,スペースの変わりにゼロでパディングするための ‘0’です.例えば,‘%5dN’はグループの新しい行の数を,五文字幅の フィールドで,printfの書式"%5d"で出力します.

(A=B?T:E)
ABに等しい場合はT,それ以外ではEになります. ABはそれぞれ10進数の定数または上記で解釈される単一文字です. この書式指定は,Aの値がBの値に等しい場合はTと等価にな ります.それ以外ではEと等価になります.

例えば‘%(N=0?no:%dN) line%(N=1?:s)’は,N(新しいファイルのグルー プの行数)が0の場合は‘no lines’と等価で,Nが1の場合は‘1 line’と等価で,それ以外の場合は‘%dN lines’と等価になります.