忽略差异中的正则表达式



我想知道是否有任何聪明的方法可以对两个文件进行差异,但将某些子字符串视为无关紧要。 例如,如果我有两个自动生成的文件,例如:

TIME:09:15:27
dir1/foo.c: val=1
dir1/bar.c: val=2

TIME:09:18:42
dir2/foo.c: val=1
dir2/bar.c: val=7

我想 diff 忽略字符串dir1dir2,并忽略TIME:xx:xx:xx行。 因此,它应该只挑出dir2/bar.c: val=X行之间的差异......

我可以做这样的事情:

tmp> diff -U0 <(sed "s/dir[0-9]+/DIR/g" file1.log) <(sed "s/dir[0-9]+/DIR/g" file2.log) -I "TIME*"
--- /dev/fd/63  2020-06-17 10:24:43.966130403 -0400
+++ /dev/fd/62  2020-06-17 10:24:43.966130403 -0400
@@ -1,3 +1,3 @@
-DIR/bar.c: val=7
+DIR/bar.c: val=3

但是,它有一些缺点:首先,键入起来很繁重,其次,它会损坏输出中的 dir1/dir2 字符串。 我想要这样的东西:

tmp> diff -U0 file1.log file2.log --ignore "wdir[0-9]w" --ignore "^TIME:.*"
-dir1/bar.c: val=7
+dir2/bar.c: val=3

我经常做这种事情,所以如果有人有什么聪明的技巧,我很想听听。

带有差异的正则表达式 -我工作得不是很好。
每个文件中必须有一行相同的行才能使其正常工作。
在这里,sed 不是好工具。
你可以试试尴尬。

awk -F '/' ' /^TIME|^$/{next} {a[$NF]++;b[$NF]=$0} END{for (i in a)if (a[i] == 1) {print b[i]}}' file1.log file2.log

字段分隔符设置为/
first,删除带有 TIME 的行 数组 a
和 b 与最后一个字段一起索引(我认为这是您要查找的(
数组 a 保留最后一个字段的出现。
数组 b 保留整行。
最后,如果一行只出现一次,请打印它。

最新更新