diff - 在与插入的行不同的部分显示更改的行

diff - 在与插入的行不同的部分显示更改的行

(我在使用 vimdiff 的情况下遇到了这个问题,它依赖于并解释 diff 的输出,所以我认为这是一个 diff 问题。)

给定这些文件,第一个有 2 行,第二个有 4 行,diff (GNU 3.3) 显示完整的文件。

< 09/02/2014 | CFCU Checking          | PAYPAL |      12.99 |            | 12.99
< 09/03/2014 | CFCU Checking          | PAYPAL |      24.45 |            | 37.44
---
> 09/02/2014 | Expenses : Advertising | Closed |            |      12.99 | 12.99
> 09/02/2014 | CFCU Checking          | PAYPAL |      12.99 |            | 0.00
> 09/03/2014 | Expenses : Advertising | Closed |            |      24.45 | 24.45
> 09/03/2014 | CFCU Checking          | PAYPAL |      24.45 |            | 0.00

这使得 vimdiff 认为那里几乎没有共享内容。如下图顶部所示,它显示匹配第 1 行的前 13 个字符,第 2 行的前 4 个字符,并且将第 3 行和第 4 行视为新的。

在这种情况下,我花了很多时间添加换行符来代替插入的行,以强制 diff (以及 vimdiff)将其显示为下图的中间。

有没有办法让 diff 更好地分解这个问题,这样 vimdiff 就会将其视为图片的底部? (这是我用 Photoshop 处理的。)

它需要 4 个部分,而不是上面显示的 1 个部分。就像是:

#,#c#,#
---
> 09/02/2014 | Expenses : Advertising | Closed |            |      12.99 | 12.99
#,#c#,#
< 09/02/2014 | CFCU Checking          | PAYPAL |      12.99 |            | 12.99
---
> 09/02/2014 | CFCU Checking          | PAYPAL |      12.99 |            | 0.00
#,#c#,#
---
> 09/03/2014 | Expenses : Advertising | Closed |            |      24.45 | 24.45
#,#c#,#
< 09/03/2014 | CFCU Checking          | PAYPAL |      24.45 |            | 37.44
---
> 09/03/2014 | CFCU Checking          | PAYPAL |      24.45 |            | 0.00

顺便说一句,vimdiff 可以通过 来使用不同的 diff 选项,diffexpr但需要默认(我认为称为ed)样式 diff。

所以,我认为我正在寻找一种方法,使 diff 不会在同一部分中混合更改的行和插入的行。

vimdiff 示例

答案1

一种经常有效的方法是增加语境,这样相邻的小差异就会被收集到一个更有凝聚力的显示中。

  • 在命令行中diff,您可以使用该-C选项来执行此操作。
  • vimdiff,你可以用diffopt设置和context功能,例如,这是隐式默认值:
    设置 diffopt=填充物,上下文:6

你可以改变它,例如

    设置 diffopt+=上下文:9
    设置 diffopt=填充物,上下文:9

除此之外:

  • 底层diff实用程序无法检测线路是否相互交换。
  • 它也没有办法在忽略某些列的同时比较文件。

给出的示例似乎是按日期排列的一系列交易。如果存在其他排序(这往往会产生更大的未更改行块),那么对数据重新排序会有所帮助。

原则上,你可以使用diffexpr设置,并构建一个对数据进行预处理/后处理的脚本,以便仅比较某些列。我用了那个方法一会儿回来制作自由格式(字级)比较实用程序。但这样做需要相当多的工作,而且并不简单,因为 diff 无法忽略其输入的列。

相关内容