如何从命令行执行便携,可读和可管道的逐字符差异?

时间:2013-10-06 14:10:08

标签: unix command-line comparison character diff

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

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

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

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

还有另外一个问题,Using 'diff' (or anything else) to get character-level diff between text files,但这个问题是由一个基于网络的工具所体现的lib所满足的,我更喜欢命令行上的东西。

2 个答案:

答案 0 :(得分:4)

我不确定这是否符合您的“命令行”标准,但我每天都会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获取/获取”)。

  6. 突出显示具有差异的线条,并且线条内的差异也会以另一种颜色突出显示。我希望这能满足您的需求。 gvim可以为您做更多事情,例如从一个文件合并到另一个文件。您可以使用命令:help diff(在gvim内)找到更多信息。

    您也可以尝试kdiff3,这可能比学习vim更容易。

答案 1 :(得分:0)

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

一个很好的支持,包括在主要发行版(如Debian,甚至Cygwin),命令行和可管理的,以及能够忽略行结尾的密切替代是wdiffwdiff可以像标准差异一样使用。不幸的是,它不是基于字符的,而是基于单词的。

对于人类使用,wdiff可能足够接近;在单词中找到单个字符不匹配是快速而简单的。主要的缺点是,如果目的是找到单个字符,它就不能用在程序和脚本中。

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