Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 忽略一行中的模式而不是整个行中的模式时发生差异_Regex_Unix_Compare_Diff - Fatal编程技术网

Regex 忽略一行中的模式而不是整个行中的模式时发生差异

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

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

文件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
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)