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

时间:2013-04-05 18:42:13

标签: regex unix compare diff

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

File1中:

[2012-01-02] Some random text foo
[2012-01-02] More output here

文件2:

[1999-01-01] Some random text bar
[1999-01-01] More output here

在这个例子中,我希望看到第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

我可以使用sed:

预处理这些文件
sed -e's/^\[....-..-..\]//' < file1 > file1.tmp
sed -e's/^\[....-..-..\]//' < file2 > file2.tmp
diff -u file1.tmp file2.tmp

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

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

2 个答案:

答案 0 :(得分:1)

您可以使用临时流来避免文件创建和清理,语法如下:

$ diff <(command with output) <(other command with output)

在你的情况下:

diff <(cat f1 | sed -e's/^\[....-..-..\]//') <(cat f2 | sed -e's/^\[....-..-..\]//')

希望这有帮助。

答案 1 :(得分:1)

由于我不确定如何保留日期,这并不完全符合您的要求,但这确实解决了您的一些问题:

diff -u --label=file1 <(sed 's/^\[....-..-..\]//' file1) --label=file2 <(sed 's/^\[....-..-..\]//' file2)

输出:

--- file1
+++ file2
@@ -1,2 +1,2 @@
- Some random text foo
+ Some random text bar
  More output here