Shell 等效变更的差异结果不一致
考虑以下文件和差异结果: a1.txtShell 等效变更的差异结果不一致,shell,diff,Shell,Diff,考虑以下文件和差异结果: a1.txt a b My name is Ian a a b My name is John a My name is Ian a a My name is John a2.txt a b My name is Ian a a b My name is John a My name is Ian a a My name is John 运行diff--并排--suppress common line a1.txt a2.txt会产生:
a
b
My name is Ian
a
a
b
My name is John
a
My name is Ian
a
a
My name is John
a2.txt
a
b
My name is Ian
a
a
b
My name is John
a
My name is Ian
a
a
My name is John
运行diff--并排--suppress common line a1.txt a2.txt
会产生:
> a
My name is Ian | My name is John
My name is Ian | a
> My name is John
它正确地表明a
添加到a2.txt
中,并且我的名字是伊恩
更改为我的名字是约翰
但是,如果我从两个文件中删除b
,则生成的结果不同:
b1.txt
a
b
My name is Ian
a
a
b
My name is John
a
My name is Ian
a
a
My name is John
b2.txt
a
b
My name is Ian
a
a
b
My name is John
a
My name is Ian
a
a
My name is John
并行运行diff--suppress common line b1.txt b2.txt
会产生:
> a
My name is Ian | My name is John
My name is Ian | a
> My name is John
这表明行我的名字是Ian
更改为a
,并且我的名字是John
被添加到b2.txt
尽管第二次比较的结果在技术上是有效的,但是a1.txt
和a2.txt
之间的差异与b1.txt
和b2.txt
之间的差异是相等的,那么为什么结果不相等呢
我能做些什么使第二次比较产生与第一次相同的结果吗?您观察到的两个例子之间的差异是正常的;它只是与您对
diff
的期望相冲突。使用线作为单位/原子来求解
[…]a1.txt和a2.txt之间的差异等同于b1.txt和b2.txt之间的差异,那么为什么结果不相等呢
在这里,两个示例中最长的公共子序列是不同的,粗略地说,不是以相同的方式“排列”的。在第一个示例中,您有
# a1.txt # a2.txt # line in common?
a n
a a y
b b y
My name is Ian My name is John n
# b1.txt # b2.txt # line in common?
a a y
My name is Ian a n
My name is John n
然而,在第二个例子中,你有
# a1.txt # a2.txt # line in common?
a n
a a y
b b y
My name is Ian My name is John n
# b1.txt # b2.txt # line in common?
a a y
My name is Ian a n
My name is John n
因此,就diff
而言,这两对文件之间的差异并不相等diff
没有内存,您获取b[12].txt文件所做的一切就是从每个a[12].txt文件中删除b
行。它所看到的是,最长的公共子序列现在只包含在包含a
的一行中,并由此推断出两个b[12].txt
文件之间的差异
我能做些什么使第二次比较产生与第一次相同的输出
除了使用不同的diff算法(或实现自己的算法),我不这么认为。[…]为什么结果不相等?您的问题源于对diff算法的误解。@Jubobs由于您对diff算法的了解似乎比我们中的许多人都多,请在答案部分给我们一个详细的答案。。将有助于lot@Jubobs你能详细说明一下吗?或者你只是在说,期望差异解释等同的变化是不合理的。。。等价地?@IAN2TEDV“不合理”中有一个值判断,所以我不会说得太远:)只是算法计算两对文件之间的差异的方式不同于您预期的方式。@hazzelnuttie请查看我的答案以获得解释。谢谢您的解释谢谢:-)谢谢您的回答