Bash中diff忽略time1/time2行差异失败,求可行解决方案
解决diff命令忽略特定行差异的问题
我明白你的问题了——你想用diff忽略file1.txt和file2.txt里time1、time2行的差异,但用diff -I "*TimeComparaison*"没效果对吧?这是因为diff的-I(也就是--ignore-matching-lines)选项有个容易踩的坑,我来给你拆解下原因和解决办法:
为什么原来的命令没生效?
diff的-I选项的逻辑是:只有当两个文件中对应的行都匹配你指定的正则表达式时,才会忽略这两行的差异。你之前用的*TimeComparaison*只能匹配file2里的time1、time2行,但file1里的这两行是time1 { value: "3580" }和time2 { value: "50589246" },根本不包含TimeComparaison字符串,所以diff不会忽略它们的差异。
三种可行的解决办法
方法1:直接过滤掉time1、time2行再比较
这是最直观的方式,用grep把两个文件里的time1、time2行都过滤掉,再比较剩下的内容:
diff <(grep -vE '^time1|^time2' file1.txt) <(grep -vE '^time1|^time2' file2.txt)
- 小说明:
<()是bash的进程替换功能,会把grep过滤后的内容当作临时文件传给diff,这样diff只会比较除了time1、time2之外的行。
方法2:统一替换time1、time2行的内容后再比较
如果你想保留time1、time2行的存在(只是忽略它们的内容差异),可以用sed把两个文件里的这两行替换成完全相同的内容,再diff:
diff <(sed -e 's/^time1.*$/time1 { ignored }/' -e 's/^time2.*$/time2 { ignored }/' file1.txt) \ <(sed -e 's/^time1.*$/time1 { ignored }/' -e 's/^time2.*$/time2 { ignored }/' file2.txt)
- 小说明:
sed的s/^time1.*$/.../会把所有以time1开头的行替换成统一内容,两个文件处理后这两行完全一致,diff自然不会报差异。
方法3:调整正则让diff -I生效
如果你坚持想用diff -I,只需要把正则改成能匹配两个文件里time1、time2行的规则就行——比如匹配以time1或time2开头的行:
diff -I '^time[12]' file1.txt file2.txt
- 小说明:正则
^time[12]会匹配所有以time1或time2开头的行,这样两个文件里的对应行都满足匹配条件,diff就会忽略它们的差异了。
内容的提问来源于stack exchange,提问作者Sedji Aka
相关产品推荐
相关产品推荐

