忽略换行符的diff / 跨多行的diff / 忽略重新排版的diff

16
有没有类似于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”在每一行都检测到了更改(这是应该的;我不是说这是diff中的错误)。但对于大型LaTeX文件来说,这是一个严重的问题。更改一段长段落中的一个单词,你得到的差异基本上是无用的。
顺便说一下,我知道这需要比通常的以行为单位的差异要花费更多的计算能力。我只在小型人工生成的文件上使用它,并且如果必须等待很长时间,我也很乐意。
2个回答

13

wdiff进行逐词对齐,

为了在终端中获得易于阅读的显示效果,请运行

 wdiff -al <file1> <file2> | less

这将会以加粗的字体显示(至少在我的系统上)<file2>中的插入内容,并以下划线标出从<file2>中删除的内容。


警告:wdiff 可能不适用于每个系统。但它是一个很棒的实用工具。 - DVK
太好了!这正是我想要的。现在我只需要等待 Stack Overflow 让我将其声明为答案。 - Adam
虽然wdiff很酷,但我有两个原因要downvote它:首先,wdiff不显示发现的差异的行号(非常不方便);其次,因为它是以单词为导向的,所以无法忽略空格中的更改(即foreach(foreach ()。我编写了一个PHP脚本来解决第二个问题,但没有行号,尝试使用grep查找“有趣”的差异是一种巨大的浪费时间。我希望能够说些关于compare++的好话,但我还没有收到他们是否有.rpm的回复。 - Jeff
2
@Jeff:“当你遇到一个极其草率、没有付出努力的帖子或者一个明显且可能危险错误的答案时,请使用你的踩票。”这个答案对于所提出的问题是正确的。它不符合你的特定要求并不意味着它是错误的,如果你有更好的解决方案,那应该作为备选答案发布。 - Zoë Peterson

1

一种方法是通过将整个文件分成单词来完成。虽然无法完全确定上下文,但可以非常精细地调整到您关心的更改类型。

示例:

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

如果文本具有特殊属性,更具体地说,如果段落被定义为连续两个换行符,则重新排版仅在段落范围内进行 - 只需将所有单个换行符替换为空格,并对结果运行常规的diff -w,您可以做得更好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接