16

2 つのテキスト ファイル間の変更を表示できるが、改行を含む空白の変更を無視できる diff のようなツールを知っている人はいますか?

次に例を示します。

素早い茶色のキツネが怠け者のクマを飛び越えました。速い茶色のキツネ
怠け者のクマを飛び越えました。速い茶色のキツネは怠け者を飛び越えた
くま。素早い茶色のキツネが怠け者のクマを飛び越えました。
素早い茶色のキツネが怠け者のクマを飛び越えました。素早い茶色のキツネが飛び跳ねた
怠惰なクマの上。素早い茶色のキツネが怠け者のクマを飛び越えました。
素早い茶色のキツネが怠け者のクマを飛び越えました。

私がしたことは、1 つの単語を削除してリフローすることだけでしたが、"diff -b" はすべての行で変更を検出しました (そうあるべきです。これが diff のバグだと言っているわけではありません)。しかし、大きな LaTeX ファイルの場合、これは大きな問題です。長い段落の 1 つの単語を変更すると、返される差分は基本的に役に立たなくなります。

ところで、これには通常の行がアトミックな diff よりもはるかに多くの計算能力が必要であることは承知しています。私は人間が生成した小さなファイルに対してのみこれを行っており、必要に応じて長い間待つことができます.

4

2 に答える 2

13

wdiffは、単語ごとの位置合わせを行います。

ターミナルで読みやすい表示を行うには、次を実行します

 wdiff -al <file1> <file2> | less

これにより、(少なくとも私のシステムでは)挿入が<file2>太字で表示され、削除が<file2>下線で表示されます。

于 2010-04-09T03:22:20.027 に答える
1

1 つのオプションは、ファイル全体を単語に分割してこれを行うことです。100% 同じ結果が得られるわけではありませんが、コンテキストを知っているという意味ではありますが、関心のある変更の種類に合わせて非常に微調整されています。

例 :

cat file1 | perl5.8 -e '{s/\s+/\n/g;}' > file1.split_words
cat file2 | perl5.8 -e '{s/\s+/\n/g;}' > file2.split_words
diff file1.split_words file2.split_words

テキストに特別なプロパティがある場合は、さらにうまくいく可能性があります。より具体的には、リフローは、行の 2 つの改行として定義されている段落の境界内でのみ発生します。単一の改行をすべてスペースに置き換え、diff -w結果に対して定期的に実行するだけです。 .

于 2010-04-09T03:22:36.890 に答える