Regex 忽略一行中的模式而不是整个行中的模式时发生差异
我经常需要比较两个文件,同时忽略这些文件中的某些更改。我不想忽略整行,只是其中的一部分。最常见的情况是行上的时间戳,但还有几十种其他模式我也需要忽略 文件1:Regex 忽略一行中的模式而不是整个行中的模式时发生差异,regex,unix,compare,diff,Regex,Unix,Compare,Diff,我经常需要比较两个文件,同时忽略这些文件中的某些更改。我不想忽略整行,只是其中的一部分。最常见的情况是行上的时间戳,但还有几十种其他模式我也需要忽略 文件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
[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
sed-e的/^\[..-..-..-..\]/'file1.tmp
sed-e的/^\[..-..-..\]/'file2.tmp
diff-u file1.tmp file2.tmp
但是我需要把这些临时文件放在某个地方,然后记得把它们清理干净。此外,我的diff输出不再引用原始文件名,也不再发出原始行
是否有一种广泛使用的diff变体或类似工具可以作为单个命令执行此操作?您可以使用临时流来避免创建和清理文件,语法如下:
$ diff <(command with output) <(other command with output)
$diff这并不是您想要的,因为我不确定如何保留日期,但这确实解决了您的几个问题:
diff -u --label=file1 <(sed 's/^\[....-..-..\]//' file1) --label=file2 <(sed 's/^\[....-..-..\]//' file2)
确切地正如Kernighan在经典软件工具中所说的,尽可能多地预处理数据,以使最终任务尽可能简单。我认为日期可以包含在类似“--label=“file1$(stat--printf”%y“file1)”的内容中。听起来这是我能得到的最接近的,除非我去破解diffutils的来源。
diff -u --label=file1 <(sed 's/^\[....-..-..\]//' file1) --label=file2 <(sed 's/^\[....-..-..\]//' file2)