【问题标题】:Diff command - avoiding monolithic grouping of consecutive differing linesDiff 命令 - 避免连续不同行的整体分组
【发布时间】:2014-08-05 20:02:26
【问题描述】:

在使用标准的 linux diff 命令时,我找不到在其输出中避免以下类型分组的方法(此处的输出列表假定为 unified format

这个问题针对的是每一行与另一个文件中的对应行略有不同的情况,将每一行放在对应的旁边会更有用。

我不想让这样的组出现在比较输出中:

- line 1 - line 2 - line 3 + line 1 modified + line 2 modified + line 3 modified

要得到这个:

- line 1 + line 1 modified - line 2 + line 2 modified - line 3 + line 3 modified

当然,这是一个方便的问题,因为这可以通过编写您自己的代码来对 diff 输出进行后处理来完成,或者使用您自己的算法与 lcs 算法不同。我认为 wdiff 等变体不会有太大帮助,因为 plain diff -U0 输出格式非常适合我的需求,除了这个分组属性,而 wdiff 引入了其他方面对我的情况不是最佳的。

我正在寻找一种命令行方式,或者可以在代码中使用的库,而不是 UI 工具。

【问题讨论】:

  • 如果你做了一些简单的事情,比如在每条真实的行之间放一个空行(只是为了区分),它会给你你想要的输出。这可以在许多工具中完成,包括 sed。不幸的是,我不知道如何从文件以外的任何内容中读取差异......然后你可以再次将它们放入 /var/tmp 然后运行 ​​diff
  • 我想我可以把它放在一起。如果文件非常不同,也许它会弄乱差异。让我们看看还会出现什么。谢谢。

标签: diff lcs


【解决方案1】:

我试图自己解决这个问题。我最接近的是:

diff -y -W 10000 file1 file2 | grep '|' | sed 's/\s*|\s*/\n/g'

一个问题是假设行首没有“空白”差异(或者您不关心它)。

【讨论】:

  • 改进版:W=1000; c=$(((W+1)/2)); diff -y -t -W $W file1 file2 | while read -r L; do a="$(echo "$L" | cut -c1-$((c-1)) | sed -E 's/ +$//')"; b="$(echo "$L" | cut -c$((c+3))-)"; echo "-$a"; echo "+$b"; done。另见here
  • 如果您有更好的答案,为什么不单独给出答案?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-21
  • 1970-01-01
  • 2011-01-12
相关资源
最近更新 更多