39

diff有一个选项-I regexp,它忽略仅插入或删除与给定正则表达式匹配的行的更改。当更改在两行之间(而不是插入或删除行)时,我需要一个类似的情况。

例如,对于给定的and ,我想忽略所有的差异,例如 between "abXd"and 。"abYd"XY

似乎diff没有这种能力。有没有合适的替代品diff

4

5 回答 5

29

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

diff <(sed '/abXd/,/abYd/d' file1) <(sed '/abXd/,/abYd/d' file2)
于 2010-12-13T23:06:43.383 回答
23

改进John Kugelman的早期解决方案:

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

可能是您正在寻找的东西!此版本标准化了每一行的特定更改,而不删除该行本身。这允许 diff 显示在线上剩余的任何其他差异。

于 2012-04-27T05:18:40.697 回答
2

假设 X 和 Y 是单个字符,那么-I 'ab[XY]d'对我来说很好。

于 2010-12-13T23:06:38.370 回答
2

您可以使用 sed 用标准字符串替换模式的实例:

diff <(sed 's/ab[XY]d/ab__REPLACED__d/g' file1) <(sed 's/ab[XY]d/ab__REPLACED__d/g' file2)
于 2014-02-21T12:10:26.497 回答
2

我的开源 Linux 工具 'dif' 比较文件,同时忽略各种差异。

它有很多选项可以进行搜索/替换、忽略空格、注释或时间戳、对输入文件进行排序、忽略某些行等。

在预处理输入文件后,它会在这些中间文件上运行 Linux 工具 meld、gvimdiff、tkdiff、diff 或 kompare。

不需要安装,只需从https://github.com/koknat/dif下载并运行“dif”可执行文件

对于您的用例,请尝试搜索和替换选项:

./dif file1 file2 -search 'ab[XY]d' -replace 'abd' -diff
于 2020-09-14T19:25:37.460 回答