如何使用 diff创建补丁文件(包含两个文件之间的差异),不包括包含某些特定模式的行(例如包含日志的行)?
我需要这样的工具,因为我有时需要在一些开发后基于两个版本的文件创建补丁。在开发过程中,我将许多调试日志行放入测试文件或只是更改调试级别(例如从DEBUG到ERROR级别)。
之后,我需要在创建基于diff工具的补丁文件之前手动删除这些调试更改。是否可以使用一些diff工具选项或创建一些脚本,这将允许我自动避免与调试消息相关的所有更改。
示例:
File1:
Log(INFO, "test1");
Log(INFO, "test2");
int a = 10;
Log(INFO, "test3");
File2:
Log(ERROR, "test1");
Log(INFO, "test2");
int a = 20;
int b = 30;
Log(INFO, "test3");
Log(ERROR, "test4");
遵循以下命令:
diff -u File1 File2
我收到输出:
-Log(INFO, "test1");
+Log(ERROR, "test1");
Log(INFO, "test2");
-int a = 10;
+int a = 20;
+int b = 30;
Log(INFO, "test3");
+Log(ERROR, "test4");
我希望在应用我需要的脚本或差异工具选项后看到以下输出:
Log(INFO, "test2");
-int a = 10;
+int a = 20;
+int b = 30;
Log(INFO, "test3");
因此,应省略与日志消息相关的任何更改。欢迎所有建议。
答案 0 :(得分:0)
过滤掉日志消息的一种简单方法是首先将所有日志消息转换为一个常见的消息(如Log(INFO, "")
),然后将所有重复的日志消息折叠为一个。运行
$ diff -u <(sed 's/Log(.*)/Log(INFO, "")/' file1 | uniq) <(sed 's/Log(.*)/Log(INFO, "")/' file2 | uniq)
--- /dev/fd/63 2014-03-19 23:38:33.976616099 +0100
+++ /dev/fd/62 2014-03-19 23:38:33.976616099 +0100
@@ -1,3 +1,4 @@
Log(INFO, "");
-int a = 10;
+int a = 20;
+int b = 30;
Log(INFO, "");
$
给出你想要的基于简单例子的内容,尽管sed 's/Log(.*)/Log(INFO, "")/' file... | uniq
命令绝不是非常复杂并且可能过于激进。如果多次使用,您可能希望将其放入脚本中。
答案 1 :(得分:0)
另一种方法是使用coccinelle删除Log
行。这是一个旨在以各种方式修改源代码的工具。删除一些东西非常简单。使用以下内容创建文件rm_log.cocci:
@@
@@
- Log(...);
将其用作
$ spatch --sp-file rm_log.cocci file1 -o file1b
init_defs_builtins: /usr/share/coccinelle/standard.h
HANDLING: file1
diff =
--- file1 2014-03-21 12:01:24.000000000 +0100
+++ /tmp/cocci-output-29762-97a65a-file1 2014-03-21 12:07:05.000000000 +0100
@@ -1,7 +1,5 @@
void f(void)
{
- Log(INFO, "test1");
- Log(INFO, "test2");
+
int a = 10;
- Log(INFO, "test3");
}
(相应地对于file2),然后你将得到没有Log niose的差异:
$ diff -u file1b file2b
--- file1b 2014-03-21 12:07:05.000000000 +0100
+++ file2b 2014-03-21 12:07:15.000000000 +0100
@@ -1,5 +1,6 @@
void f(void)
{
- int a = 10;
+ int a = 20;
+ int b = 30;
}