如何忽略差异中的移动行

如何忽略差异中的移动行

我目前正在开发一个源代码生成工具。为了确保我的更改不会引入任何新错误,diff理论上来说,更改前后程序输出之间的对比将是一个有用的工具。

import然而,这比人们想象的要难,因为该工具以半随机的方式输出顺序无关紧要的行(如语句、函数声明等)。因此,的输出diff杂乱无章,包含许多更改,而这些更改实际上只是将行移动到了同一文件中的另一个位置。

有没有办法让 diff 忽略这些移动并仅输出真正添加或删除的行?

答案1

您可以做一个简单的差异,将结果存储在某处(以避免另一个差异),循环遍历任一版本中的行,然后从另一端删除它们。

这催生了独立项目用于工作代码。代码。

答案2

你可以先尝试对它们进行排序。例如:

sort file-a > s-file-a
sort file-b > s-file-b
diff s-file-a s-file-b

Bash(和 zsh)可以在一行中完成此操作流程替代

diff <(sort file-a) <(sort file-b)

答案3

如果文件结构分为多个部分,那么只是部分顺序混乱,并且存在一个正则表达式可以用来识别部分标题,那么你可以拆分将文件分成各个部分,然后成对比较各部分。

例如,我刚刚在两个 MySQL 转储上执行了此操作,以在一些数据库名称更改大小写后对它们进行比较(因此转储以不同的顺序列出它们):

csplit all-07sep2015-11:19:12.sql '/Current Database/-1' '{*}'  # split the dump made before the change, creating files xx00, xx01, ...
csplit -f yy all-07sep2015-12:26:12.sql '/Current Database/-1' '{*}' # split the dump made after the change, creating files yy00, yy01, ...
fgrep 'Current Database' xx?? yy?? | perl -lne 'BEGIN{my %foo}; /(^....).*`(.*)`/ and push(@{$foo{lc($2)}}, $1); END {printf("diff -di %s %s\n", @{$_}) for values %foo}' | sh -x | less  # match the pairs and compare them with diff

答案4

听起来你似乎可以控制这个工具。然后让它的输出可预测:不要以半随机顺序发出声明,而是使用(比如说)字母顺序作为最后的手段。这不仅有利于从 diff 中删除无用的内容,而且还使工具的输出更易于人类阅读和验证。

相关内容