web-dev-qa-db-ja.com

diffコマンドのいくつかの違いを無視する方法は?

diffにはオプション-I regexpがあり、指定された正規表現に一致する行を挿入または削除するだけの変更は無視されます。変更が2つの行の間にある場合(行を挿入または削除する場合)は、これに類似したものが必要です。

たとえば、与えられたXYについて、"abXd""abYd"のようなすべての違いを無視したいと思います。

diffにはそのような能力はないようです。 diffの適切な代替手段はありますか?

30
Vahagn

sedを使用して2つのファイルをフィルタリングし、不要な行を削除できます。一般的なパターンは/regex1/,/regex2/ d 2つの正規表現に一致する行の間のすべてを削除します。例えば:

diff <(sed '/abXd/,/abYd/d' file1) <(sed '/abXd/,/abYd/d' file2)
23
John Kugelman

John Kugelmanによる 以前の解決策 の改善:

diff <(sed 's/ab[XY]d/abd/g' file1) <(sed 's/ab[XY]d/abd/g' file2)

おそらくあなたが探しているかもしれません!このバージョンでは、行自体を削除せずに、各行の特定の変更を正規化します。これにより、diffは行に残っているother違いを表示できます。

19

Sedを使用して、パターンのインスタンスを標準の文字列に置き換えることができます。

diff <(sed 's/ab[XY]d/ab__REPLACED__d/g' file1) <(sed 's/ab[XY]d/ab__REPLACED__d/g' file2)
1
slim

XとYが単一の文字であるとすると、-I 'ab[XY]d'は問題なく動作します。

1