次: , 上: 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'と等価になります.