我目前正在开发一个源代码生成工具。为了确保我的更改不会引入任何新错误,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 中删除无用的内容,而且还使工具的输出更易于人类阅读和验证。