Diffと " - GTYPE-group-format"

diff と比較したいファイルが2つあります。変更された行に接頭辞 "U"、改行 "I"、削除された行 "D"が表示されます。

file1:

1
2
3
4
5

file2:

1
2a
4
5
6

diff --old-group-format="D %<" \
--new-group-format="I %>" \
--changed-group-format="U %>" \
--unchanged-group-format="" file1 file2

出力は次のとおりです。

U 2a
I 6

しかし、どこに

D 3

3
答えがあなたの問題を解決する場合は、その横にある大きなチェックマーク(✓)をクリックして問題を解決してください。他の回答が役に立ったら、投票してください。受諾とアップ投票の回答は、回答した人だけでなく、今後の読者にも役立ちます。 関連するヘルプセンターの記事をご覧ください。質問にまだ完全に回答していない場合は、フィードバックを提供してください。
追加された 著者 mklement0,

2 答え

これはdiffグループのもののようなものです。 changed グループで、新しい変更を印刷します。古いものは印刷しません。

U 2
3

したがって、diffが見えるグループ化は次のとおりです。

`1 -> 1` unchanged
`2,3 -> 2a` changed
`4,5 -> 4,5` unchanged
`  -> 6` new

diffが "old"と一致するものをグループ化するには、前後に変更がなければなりません。だからfile2がこのようなものだったら:

1a
2
4
5
6

そしてあなたは同じdiffコマンドを実行しました。これは次のようになります:

U 1a
D 3
I 6

Because there is a 2 -> 2 and 4 -> 4 that is unchanged so the missing 3 gets grouped as "old".

7
追加された
さて、前と後には変わらないようにしなければならないが、私は注文を支配していない。結果を得る別の方法はありますか?
追加された 著者 Toru,

Jon Linの有益な答えを補足する:

While you can't use the ---group-format options directly to always show deleted lines (as explained in Jon's answer), the --side-by-side (-y) output-format option does contain the desired information, and you can use awk to reformat it as desired:

diff --suppress-common-lines --side-by-side file1 file2 | 
 awk -F'\t+' '$2 ~/+\|/ { print "U " $3 }
              $2 ~/+</{ print "D " $1 }
              $2 ~/+>/  { print "I " $3 }'

サンプルファイルを使用すると、次のような結果が得られます。

U 2a
D 3
I 6

上記の - side-by-side 出力から生成された上記の awk

2                                 | 2a
3                                 <
                                  > 6
0
追加された