2010-12-13 107 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)