虽然忽略了一条线内的图案,但忽略了整条线

Eri*_*ric 6 regex unix diff compare

我经常需要比较两个文件,而忽略这些文件中的某些更改.我不想忽略整条线,只是它们的一部分.最常见的情况是线上的时间戳,但我还需要忽略其他几十种模式.

文件1:

[2012-01-02] Some random text foo
[2012-01-02] More output here
Run Code Online (Sandbox Code Playgroud)

文件2:

[1999-01-01] Some random text bar
[1999-01-01] More output here
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我想看到第1行的差异,但不是第2行.

使用diff的-I选项不起作用,因为它忽略整行.理想输出:

--- file1       2013-04-05 13:39:46.000000000 -0500
+++ file2       2013-04-05 13:39:56.000000000 -0500
@@ -1,2 +1,2 @@
-[2012-01-02] Some random text foo
+[1999-01-01] Some random text bar
 [2012-01-02] More output here
Run Code Online (Sandbox Code Playgroud)

我可以用sed预处理这些文件:

sed -e's/^\[....-..-..\]//' < file1 > file1.tmp
sed -e's/^\[....-..-..\]//' < file2 > file2.tmp
diff -u file1.tmp file2.tmp
Run Code Online (Sandbox Code Playgroud)

但后来我需要将这些临时文件放在某处,并记得事后清理它们.此外,我的diff输出不再引用原始文件名,也不再发出原始行.

是否有广泛可用的差异变体或类似工具,可以作为单个命令执行此操作?

And*_*ark 1

这并不完全是您正在寻找的,因为我不确定如何保留日期,但这确实解决了您的几个问题:

diff -u --label=file1 <(sed 's/^\[....-..-..\]//' file1) --label=file2 <(sed 's/^\[....-..-..\]//' file2)
Run Code Online (Sandbox Code Playgroud)

输出:

diff -u --label=file1 <(sed 's/^\[....-..-..\]//' file1) --label=file2 <(sed 's/^\[....-..-..\]//' file2)
Run Code Online (Sandbox Code Playgroud)