8

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

文件1:

[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 输出不再引用原始文件名,也不再发出原始行。

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

4

2 回答 2

2

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

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

在你的情况下:

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

希望这可以帮助。

于 2013-04-05T19:01:56.347 回答
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
于 2013-04-05T19:02:12.047 回答