为什么DIFF与忽略匹配行不会按预期工作?(Why diff with ignore matchin

2019-08-19 10:44发布

我有以下文件:

FILE1.TXT

###################################################
Dump stat Title information for 'ssummary' view
###################################################
Tab=> 'Instance' Title=> {text {Total instances: 7831}}
Tab=> 'Device' Title=> {text {Total spice devices: 256}}
Tab=> 'Memory' Title=> {text {Total memory allocated: 962192 kB}}
Tab=> 'Cpu' Title=> {text {Total cumulative CPU time: 9030 ms}}

FILE2.TXT

###################################################
Dump stat Title information for 'ssummary' view
###################################################
Tab=> 'Instance' Title=> {text {Total instances: 7831}}
Tab=> 'Device' Title=> {text {Total spice devices: 256}}
Tab=> 'Memory' Title=> {text {Total memory allocated: 9621932 kB}}
Tab=> 'Cpu' Title=> {text {Total cumulative CPU time: 90303 ms}}

而我运行以下命令:

diff -I 'Memory' file1.txt file2.txt

其输出:

6,7c6,7
< Tab=> 'Memory' Title=> {text {Total memory allocated: 962192 kB}}
< Tab=> 'Cpu' Title=> {text {Total cumulative CPU time: 9030 ms}}
---
> Tab=> 'Memory' Title=> {text {Total memory allocated: 9621932 kB}}
> Tab=> 'Cpu' Title=> {text {Total cumulative CPU time: 90303 ms}}

但是我的预期成果是:

< Tab=> 'Cpu' Title=> {text {Total cumulative CPU time: 9030 ms}}
---
> Tab=> 'Cpu' Title=> {text {Total cumulative CPU time: 90303 ms}}

需要注意的是在命令如果我改变“记忆”到“标签”或“标题”问题的解决,但可能是所有行会被忽略的原因,他们都有标签和标题。

Answer 1:

这种行为看起来有点怪异确实如此。 我发现了一些通过调整你的输入文件(我刚搬来的“内存”行对两个文件的顶部):

FILE1.TXT

###################################################
Dump stat Title information for 'ssummary' view
###################################################
Tab=> 'Memory' Title=> {text {Total memory allocated: 962192 kB}}
Tab=> 'Instance' Title=> {text {Total instances: 7831}}
Tab=> 'Device' Title=> {text {Total spice devices: 256}}
Tab=> 'Cpu' Title=> {text {Total cumulative CPU time: 9030 ms}}

FILE2.TXT

###################################################
Dump stat Title information for 'ssummary' view
###################################################
Tab=> 'Memory' Title=> {text {Total memory allocated: 9621932 kB}}
Tab=> 'Instance' Title=> {text {Total instances: 7831}}
Tab=> 'Device' Title=> {text {Total spice devices: 256}}
Tab=> 'Cpu' Title=> {text {Total cumulative CPU time: 90303 ms}}

一个普通的差异会给你:

diff file1.txt file2.txt

4c4
< Tab=> 'Memory' Title=> {text {Total memory allocated: 962192 kB}}
---
> Tab=> 'Memory' Title=> {text {Total memory allocated: 9621932 kB}}
7c7
< Tab=> 'Cpu' Title=> {text {Total cumulative CPU time: 9030 ms}}
---
> Tab=> 'Cpu' Title=> {text {Total cumulative CPU time: 90303 ms}}

请注意,有两套不同......现在与安排, diff -I 'Memory' file1.txt file2.txt命令工作和输出这样的:

7c7
< Tab=> 'Cpu' Title=> {text {Total cumulative CPU time: 9030 ms}}
---
> Tab=> 'Cpu' Title=> {text {Total cumulative CPU time: 90303 ms}}

这意味着,在-I标志似乎工作,只有当在一组差异每一行的表达式匹配 。 我不知道这是否是一个错误或预期的行为......但它肯定不一致。


编辑 :实际上,按照该GNU的diff文件 ,这是预期的行为。 该手册页不是那么清楚。 OpenBSD的差异有一个-I标志太多,但他们的手册页解释了它更好。



Answer 2:

这是正常现象给出的方式diff作品(如2013年4月的)。

diff是面向行的,这意味着一条线或者认为完全不同的或完全等效。 当行被忽略,它被输入到不同线路的名单比较之前,当更改脚本计算,只有忽略行所做的更改都认为自己是被忽略。 当忽略线相邻的改线,它构成了一个单一的非忽略的变化。

问题在于不能的diff了解,连续的线都没有关系:你是不是比较文本序列(什么diff的目的是),而这是有方向性的独立线路列表( Tab >= <key> )。 当这两个文件以相同的顺序生成,但还是不一样的,这些问题看起来很相似。



Answer 3:

那么你每天学习新的东西。 我也同样感到困惑,并通过这种行为,这似乎是大约受挫[DIFF输入文件,然后筛选出RE]而不是[筛选出RE输入文件,然后diff的。

我本来以为第二种方式更自然,更实用。 举例来说,这似乎是一路--ignore情况和--strip尾随-CR工作,版本比较之前调整输入文件。 此外,实际实现提问想要的东西包括过滤两个输入到临时文件,版本比较它们,然后删除它们。 如果你想做一个递归的差异和我一样变得更加繁琐。

我承认差异表现它的记录,而不是我怎么想它的行为方式,但恭敬地认为,此选项(和-b类似,-w太)可以有效地加入到差异。



Answer 4:

这是预期行为按diffutils手册:

然而, -I忽略包含正则表达式,如果每个改变的线在大块 (每次插入和每次缺失) 的正则表达式匹配线的插入或缺失。

换言之, 对于每一个不可忽略的变化, diff打印成套在其附近改变,包括那些忽略的 。 你可以指定一个以上的正则表达式的行通过使用一个以上的忽略-I选项。 diff尝试匹配针对每个正则表达式的每个线,从给定的最后一个。 ( 男人DIFF )

您可以尝试通过指定设置一组较小的变化-d ,但在你的例子,它不会工作。

-d --minimal尽力去找到一组小的变化。



Answer 5:

从人差异,如果我记得不错,-I会忽略它包含的REG进出口。 这意味着,如果F1是:

the pen is on the table

f2为:

the pun is on the table

将正确解析:

diff -I 'p.n' f2 f2

给什么

如果F2现在变成

the pun is on the cable

正则表达式不再被匹配(电缆和表不是由正则表达式匹配......)等ü将有两条线即将在输出...

所以,只要尝试改变命令:

diff -I '.*Memory.*' file1.txt file2.txt

应该做的伎俩(抱歉愚蠢的例子。)



文章来源: Why diff with ignore matching lines doesn't work as expected?