diff
有一个选项-I regexp
,它会忽略仅插入或删除与给定正则表达式匹配的行的更改。我需要对这种情况进行类比,当两行之间发生变化时(而不是插入或删除行)。
例如,对于给定的"abXd"
和"abYd"
,我想忽略X
和Y
之间的所有差异。
似乎diff
没有这种能力。 diff
是否有合适的替代方案?
答案 0 :(得分:22)
您可以通过sed
过滤这两个文件,以消除您不关心的行。一般模式是/regex1/,/regex2/ d
以删除与两个正则表达式匹配的行之间的任何内容。例如:
diff <(sed '/abXd/,/abYd/d' file1) <(sed '/abXd/,/abYd/d' file2)
答案 1 :(得分:19)
John Kugelman对earlier solution的改进:
diff <(sed 's/ab[XY]d/abd/g' file1) <(sed 's/ab[XY]d/abd/g' file2)
可能是您正在寻找的!此版本规范化每行的特定更改,而不删除行本身。这允许diff显示在线上保留的任何其他差异。
答案 2 :(得分:1)
假设X和Y是单个字符,那么-I 'ab[XY]d'
对我来说很好。
答案 3 :(得分:1)
您可以使用sed将模式的实例替换为标准字符串:
diff <(sed 's/ab[XY]d/ab__REPLACED__d/g' file1) <(sed 's/ab[XY]d/ab__REPLACED__d/g' file2)
答案 4 :(得分:1)
我的开源Linux工具'dif'在比较文件时忽略了各种差异。
它具有许多选项,可进行搜索/替换,忽略空格,注释或时间戳,对输入文件进行排序,忽略某些行等。
预处理输入文件后,它会在这些中间文件上运行Linux工具meld,gvimdiff,tkdiff,diff或kompare。
不需要安装,只需从https://github.com/koknat/dif下载并运行'dif'可执行文件
对于您的用例,请尝试搜索并替换选项:
./dif file1 file2 -search 'ab[XY]d' -replace 'abd' -diff