2010-12-13 67 views
26

diff有一个选项-I regexp,它忽略只插入或删除与给定正则表达式匹配的行的更改。在两行之间进行更改(而不是插入或删除行)时,我需要对此进行类比。如何忽略差异命令中的一些差异?

例如,我想忽略"abXd""abYd"之间的所有差异,给定的XY

看来diff还没有这样的能力。 diff有没有合适的替代品?

回答

18

您可以通过sed过滤这两个文件,以消除您不关心的行。一般模式是/regex1/,/regex2/ d删除匹配两个正则表达式的行之间的任何东西。例如:

diff <(sed '/abXd/,/abYd/d' file1) <(sed '/abXd/,/abYd/d' file2) 
+1

感谢您的回答。 'sed'/ regex/d'file'删除'file'中出现匹配'regex'的所有行。有没有办法删除行,但只有它的匹配部分? – Vahagn 2010-12-14 07:41:21

+0

我不确定你想要做什么。你能用一个你想要区分的两个文件的例子来编辑你的问题吗?你想要结果是什么? – 2010-12-14 16:58:35

+0

不幸的是,这对于递归('-r')diff不起作用,原因很明显。 – 2017-01-20 09:41:16

0

假设X和Y是单个字符,那么-I 'ab[XY]d'适合我。

+0

而对我来说太。 – user2023370 2013-09-16 20:46:04

+6

这完全忽略了这条线。如果您关心的线路中存在其他差异,则会隐藏它们。 – CoatedMoose 2013-10-24 23:16:29

18

在改进了earlier solution约翰Kugelman:

diff <(sed 's/ab[XY]d/abd/g' file1) <(sed 's/ab[XY]d/abd/g' file2) 

可能是你可能会寻找!此版本将每行上的特定更改标准化,而不删除行本身。这允许diff显示任何其他仍然存在的差异。

1

你可以使用SED一个标准的字符串替换模式的实例:

diff <(sed 's/ab[XY]d/ab__REPLACED__d/g' file1) <(sed 's/ab[XY]d/ab__REPLACED__d/g' file2)