8

标准 diff 工具对于查找文件中不同的行非常有用,但它不适用于逐个字符的差异。我经常需要在不同步的情况下在不同的计算机上逐个字符地合并文本(即书面文本,而不是代码)(是的,我知道我不应该这样做,但无论如何都会发生)。除了添加一两段之外,我还可能更改了逗号、拼写错误或文本中以前对两个文件都通用的其他一些小的更改。

Diff 会告诉我哪些行发生了变化,但由于每行可能有多个差异,我必须仔细扫描这些行以找到每行每个物理上很小但重要的差异。修复后,我必须重复 diff 以确保我没有错过任何编辑。当行是段落格式(即每段一行)以及许多连续行具有如此小的差异时,情况会变得更糟。

现在我必须承认,我通常只是将这两个文件加载到 Microsoft Word 中并使用其内置的 diff 功能。启动一个像 Word 这样的大包只是为了找到一些小的差异当然是不方便的,但至少它会逐个字符地比较文件。

我真正想要的是一种 Unix 方式来做到这一点。一个小而可爱的工具或脚本,它对文本进行逐个字符的比较,即不是基于行的,能够忽略行尾,通过一些合理的 ascii-art 进行报告,并且完全可以通过管道在命令行中使用脚本?

还有另一个问题,使用'diff'(或其他任何东西)来获得文本文件之间的字符级差异,但这个问题由基于网络的工具举例说明的lib满足,我更喜欢命令上的东西 -线。

4

2 回答 2

5

我不确定这是否符合您的“命令行”标准,但我gvim/vim每天都用于此目的。

  1. 像这样打开要区分的文件:

    gvim -d file1 file2
    
  2. 使窗口全屏显示,以便于查看

  3. 使用以下命令使拆分窗口内部gvim大小相等:(C-w =即 Control+W 然后=

  4. 要更好地查看段落格式的行,请输入,然后使用(或通过鼠标单击):set wrap切换到另一个拆分窗口,然后输入C-w w:set wrap

  5. 要在更改之间移动,请使用[c]c。要合并更改,请使用dp("diff put") 和do("diff gain/get")。

有差异的线被突出显示,线内的差异也用另一种颜色突出显示。我希望这能满足你的需要。gvim可以为您做更多的事情,例如从一个文件合并到另一个文件。:help diff您可以使用命令(内部)了解更多信息gvim

你也可以试试kdiff3,可能比学习容易vim

于 2013-10-06T14:31:00.287 回答
0

似乎我们能得到的最接近的是 janos 的 vimdiff 答案,尽管它不是命令行。

一个很好的替代方案,包括在主要发行版(如 Debian,甚至 Cygwin)中,命令行和管道,以及能够忽略行尾是wdiff. wdiff可以以与标准差异相同的方式使用。不幸的是,它不是基于字符的,而是基于单词的。

对于人类使用,wdiff可能已经足够接近了;查找单词中的单个字符不匹配既快捷又简单。主要缺点是如果目的是查找单个字符,则不能在程序和脚本中使用它。

实际上似乎不存在任何受支持的基于命令行字符的差异:-(。

于 2013-10-12T14:48:37.693 回答