【问题标题】:newline-ignoring diff / diff across multiple lines / reflow-ignoring diff忽略换行的差异/跨多行的差异/忽略回流的差异
【发布时间】:2011-02-05 23:44:34
【问题描述】:

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

这是一个例子:

敏捷的棕狐跳过了懒熊。敏捷的棕色狐狸 跳过懒熊。敏捷的棕色狐狸跳过懒惰的 熊。敏捷的棕狐跳过了懒熊。 敏捷的棕狐跳过了懒熊。敏捷的棕色狐狸跳了起来 在懒熊之上。敏捷的棕狐跳过了懒熊。 敏捷的棕狐跳过了懒熊。

我所做的只是删除一个单词并重新排列它,但是“diff -b”检测到每一行的更改(应该如此;我并不是说这是 diff 中的错误)。但是对于大型 LaTeX 文件,这是一个主要问题;长段换一个字,回来的diff基本没用。

顺便说一句,我知道这需要比通常的 lines-are-atomic diff 更多的计算能力。我只对人为生成的小文件执行此操作,如果需要,我很乐意等待很长时间。

【问题讨论】:

    标签: diff word-diff


    【解决方案1】:

    wdiff 进行逐字对齐。

    为了在终端中显示易于阅读,请运行

     wdiff -al <file1> <file2> | less
    

    这将显示(至少在我的系统上)&lt;file2&gt;boldfaced 中的插入和&lt;file2&gt; 中的删除加下划线。

    【讨论】:

    • 警告:wdiff 可能并非在每个系统上都可用。但它是一个很酷的实用程序
    • 万岁!这正是我想要的。现在我只需要等待堆栈溢出让我宣布这是答案。
    • 虽然 wdiff 有点酷,但我实际上出于两个原因对此表示反对:首先,wdiff 不显示找到的差异的行号(极大的不便);其次,因为它是面向单词的,它不能忽略空格的变化(即foreach( vs foreach ()。我已经编写了一个 PHP 脚本来弥补第二个问题,但是如果没有行号,那么尝试用 grep 查找“有趣的”差异会浪费大量时间。我希望对 compare++ 说点好话,但我还没有收到他们关于他们是否有 .rpm 的回复
    • @Jeff “每当你遇到一个非常草率、不费吹灰之力的帖子,或者一个明显不正确且可能危险地不正确的答案时,请使用你的反对票。”对于所提出的问题,答案是正确的。它不符合您的具体要求并不意味着它不正确,如果您有更好的解决方案,则应将其作为替代答案发布。
    【解决方案2】:

    一种选择是通过将整个文件拆分为单词来完成此操作。在了解上下文时不是 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 结果。

    【讨论】:

      猜你喜欢
      • 2017-07-03
      • 2017-02-15
      • 2021-06-27
      • 1970-01-01
      • 2011-07-29
      • 2012-01-02
      • 1970-01-01
      • 2011-11-22
      • 2021-06-09
      相关资源
      最近更新 更多