newline-ignoring diff / diff跨越多行/ reflow-ignoring diff

时间:2010-04-09 03:18:07

标签: diff word-diff

有没有人知道类似diff的工具可以显示两个文本文件之间的变化,但忽略空白的变化,包括换行符

以下是一个例子:

the quick brown fox jumped over the lazy bear.  the quick brown fox
jumped over the lazy bear.  the quick brown fox jumped over the lazy
bear.  the quick brown fox jumped over the lazy bear.
quick brown fox jumped over the lazy bear.  the quick brown fox jumped
over the lazy bear.  the quick brown fox jumped over the lazy bear.
the quick brown fox jumped over the lazy bear.

我所做的只是删除一个单词并重排它,但“diff -b”检测到每一行的变化(因为它应该;我不是说这是差异中的错误)。但对于大型LaTeX文件,这是一个主要问题;改变一个长段中的一个单词,你得到的差异基本没用。

顺便说一句,我知道这需要比通常的线 - 原子差异更多的计算能力。我只是在人类生成的小文件上执行此操作,如果必须,我很乐意等待很长时间。

2 个答案:

答案 0 :(得分:12)

wdiff逐字对齐。

要在终端中轻松阅读显示,请运行

 wdiff -al <file1> <file2> | less

这将显示(至少在我的系统中)<file2>粗体插入和<file2>下划线删除。

答案 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