実際には空白を完全に無視するDiff

実際には空白を完全に無視するDiff

2 つのファイルを比較し、実際にすべての空白を無視するアプリケーションを探しています。たとえば、次のようになります。

class foo { 
  bar
  spaz 
}

は、

class foo{bar spaz}

または、同様に

classfoo { 
  barspaz}

だがしかし

classfoo { 
  spazspaz
}

つまり、前の例のが他の例の にspaz置き換わっていることがわかります。比較する必要があるのは 2 つのファイルだけです。bar

  • これはWindowsまたはLinux/Unix/POSIX互換のユーティリティです
  • lin/unixコマンドを試してみましたがdiff -w、違いがある場合にのみ空白を無視します行ごと空白です。完全に空白を無視します。
  • また、Windows 用の有料の比較ユーティリティである UECompare または Ultracompare も試しました。

答え1

コマンドのようなものをお探しですかtr?ここにありますマニュアルページ私の知る限り、、、msysgitに含まれています。cygwingnuwin32 tools

したがって、次のようにして、比較する前にすべての空白を削除できます。

tr --delete '[:space:]' <filename.txt

その後、そのコマンドの出力を に入力してdiff、空白なしで動作させることができます。

たとえば、 という名前のファイルがありますHelloWorldApp.java。これがどのように処理されるかを説明しますtr

C:\temp>cat HelloWorldApp.java
class HelloWorldApp {
    public static void main(String[] args) {
        System.out.println("Hello World!"); // Display the string.
    }
}
C:\temp>tr -d '[:space:]' <HelloWorldApp.java
classHelloWorldApp{publicstaticvoidmain(String[]args){System.out.println("HelloWorld!");//Displaythestring.}}

答え2

ライン指向であるにもかかわらず、できた要求されたことを実行するようにできます。大まかに言うと、diff -w を実行してから、diff 出力を後処理することができます。diff 出力を調べて、さまざまな行のペアを結合し、それらが (現在) 他のファイルの行と一致するかどうかを確認できます。

O(n^2) か何か厄介なことのように思えますが、差分出力の移動「ウィンドウ」で、ファイル 1 の結合なし、2 行の結合、3 行の結合 X、ファイル 2 の結合なし、2 行の結合、3 行の結合 (X は ~「外積」) に制限されていれば、非常に役立ちます。

実際、Perl diff 出力後処理スクリプトで数時間の作業で実行できる作業のように思えます (Perl プログラミング スキルによって異なります)

たぶん、仕事中にやりたくないタスクがあるときでしょう... :-)

関連情報