15

次のファイルがあります。

file1.txt:

###################################################
Dump stat Title information for 'ssummary' view
###################################################
Tab=> 'Instance' Title=> {text {Total instances: 7831}}
Tab=> 'Device' Title=> {text {Total spice devices: 256}}
Tab=> 'Memory' Title=> {text {Total memory allocated: 962192 kB}}
Tab=> 'Cpu' Title=> {text {Total cumulative CPU time: 9030 ms}}

file2.txt:

###################################################
Dump stat Title information for 'ssummary' view
###################################################
Tab=> 'Instance' Title=> {text {Total instances: 7831}}
Tab=> 'Device' Title=> {text {Total spice devices: 256}}
Tab=> 'Memory' Title=> {text {Total memory allocated: 9621932 kB}}
Tab=> 'Cpu' Title=> {text {Total cumulative CPU time: 90303 ms}}

そして、私は次のコマンドを実行しています:

diff -I 'Memory' file1.txt file2.txt

出力:

6,7c6,7
< Tab=> 'Memory' Title=> {text {Total memory allocated: 962192 kB}}
< Tab=> 'Cpu' Title=> {text {Total cumulative CPU time: 9030 ms}}
---
> Tab=> 'Memory' Title=> {text {Total memory allocated: 9621932 kB}}
> Tab=> 'Cpu' Title=> {text {Total cumulative CPU time: 90303 ms}}

ただし、期待される出力は次のとおりです。

< Tab=> 'Cpu' Title=> {text {Total cumulative CPU time: 9030 ms}}
---
> Tab=> 'Cpu' Title=> {text {Total cumulative CPU time: 90303 ms}}

コマンドで「メモリ」「タブ」または「タイトル」に変更すると問題は解決しますが、おそらくすべての行が無視されることに注意してください。これは、すべての行にタブとタイトルがあるためです。

4

5 に答える 5

7

diff2013 年 4 月現在、この動作は正常な動作です。

diffは線指向であり、線が完全に異なるか、または完全に同等であると見なされることを意味します。行が無視されると、比較の前に別の行のリストに入力され、変更スクリプトが計算されると、無視された行のみに加えられた変更は、それ自体が無視されたと見なされます。無視された行が変更された行に隣接している場合、それは単一の無視されない変更を構成します。

問題は、diff連続する行が関連していないことを理解できないことにあります。テキストのシーケンス (diff目的) を比較しているのではなく、キーが付けられた独立した行のリスト ( Tab >= <key>) を比較しているのです。両方のファイルが同じ順序で生成された場合、これらの問題はかなり似ているように見えますが、それでも同じではありません。

于 2013-04-10T10:43:15.420 に答える
5

この振る舞いは確かに少し奇妙に見えます。入力ファイルを微調整して何かに気づきました(両方のファイルの「メモリ」行を一番上に移動しました):

file1.txt

###################################################
Dump stat Title information for 'ssummary' view
###################################################
Tab=> 'Memory' Title=> {text {Total memory allocated: 962192 kB}}
Tab=> 'Instance' Title=> {text {Total instances: 7831}}
Tab=> 'Device' Title=> {text {Total spice devices: 256}}
Tab=> 'Cpu' Title=> {text {Total cumulative CPU time: 9030 ms}}

file2.txt

###################################################
Dump stat Title information for 'ssummary' view
###################################################
Tab=> 'Memory' Title=> {text {Total memory allocated: 9621932 kB}}
Tab=> 'Instance' Title=> {text {Total instances: 7831}}
Tab=> 'Device' Title=> {text {Total spice devices: 256}}
Tab=> 'Cpu' Title=> {text {Total cumulative CPU time: 90303 ms}}

単純な差分はあなたに与えるでしょう:

diff file1.txt file2.txt

4c4
< Tab=> 'Memory' Title=> {text {Total memory allocated: 962192 kB}}
---
> Tab=> 'Memory' Title=> {text {Total memory allocated: 9621932 kB}}
7c7
< Tab=> 'Cpu' Title=> {text {Total cumulative CPU time: 9030 ms}}
---
> Tab=> 'Cpu' Title=> {text {Total cumulative CPU time: 90303 ms}}

現在、2 組の違いがあることに注意してください...その配置により、diff -I 'Memory' file1.txt file2.txtコマンド機能し、次のように出力されます。

7c7
< Tab=> 'Cpu' Title=> {text {Total cumulative CPU time: 9030 ms}}
---
> Tab=> 'Cpu' Title=> {text {Total cumulative CPU time: 90303 ms}}

つまり、-Iフラグは、一連の相違点のすべての行が式に一致する場合にのみ機能するようです。これがバグなのか、予想される動作なのかはわかりませんが、一貫性がないことは確かです。


編集:実際には、 GNU diff のドキュメントに従って、これは予期される動作です。manページはそれほど明確ではありません。OpenBSD diff にも-Iフラグがありますが、man ページの方が詳しく説明されています。

于 2013-04-04T10:37:53.120 に答える
3

まあ、あなたは毎日何か新しいことを学びます。[入力ファイルから RE を除外してから diff] ではなく、大まかに [入力ファイルを diff してから RE を除外する] ように思われるこの動作にも同様に混乱し、不満を感じていました。

2 番目のアプローチの方が自然で便利だと思いました。たとえば、これは方法--ignore-case--strip-trailing-cr機能のようで、差分を取る前に入力ファイルを調整します。さらに、質問者が望んでいたことを実際に達成するには、両方の入力を一時ファイルにフィルターし、それらを比較してから削除する必要があります。私のように再帰的な diff を実行したい場合は、さらに面倒です。

diff は、私が望んでいる方法ではなく、文書化されている方法で動作することを認めますが、このオプション (および同様のオプション) を diff に追加すると便利であることを丁重に提案し-bます-w

于 2016-06-01T08:39:47.153 に答える
0

man diff から、よく思い出せば、 -I はそれに含まれる正規表現を無視するだけです。つまり、f1 が次の場合:

the pen is on the table

f2 は次のとおりです。

the pun is on the table

正しく解析します:

diff -I 'p.n' f2 f2

何も与えない

しかし

f2が今になると

the pun is on the cable

正規表現はもう一致しません(ケーブルとテーブルは正規表現と一致しません...)ので、出力に2行が表示されます...

したがって、次のコマンドを変更してみてください。

diff -I '.*Memory.*' file1.txt file2.txt

それはトリックを行うはずです(愚かな例で申し訳ありません..)

于 2013-04-04T10:33:32.630 に答える