从补丁文件中删除C注释的方法

时间:2012-05-11 17:12:01

标签: c patch strip utilities

我正在尝试从我们的补丁文件中删除C注释并查看了许多正则表达式,但是如果我们从补丁中删除行 - 它会破坏它们。

如何编写正则表达式或sed命令来搜索diff补丁文件以获取注释并用空格替换注释行。

这适用于sed正则表达式适用于C文件,但对于补丁我需要不同的东西:

sed '/^\/\*/,/\*\//d'

示例补丁exerpt将是:

@@ -382,7 +391,109 @@
        return len;
 }

+/**********************************************************************************
+ * Some patch
+ * Author: Mcdoomington
+ * Do somethimg
+ * 
+ * fix me
+ **********************************************************************************/

有人有想法吗?

编辑:

使用此过滤器:

sed -e 's,^+ \*.*,+ \/\/Comment removed,' mypatch.patch > output


+/**********************************************************************************
+ //Comment removed
+ //Comment removed
+ //Comment removed

如何添加if行以\结尾以跳过它?

编辑:解决方案

虽然不是最干净的方式 - 我使用sed与陪审团操纵的正则表达式。

sed -e '/[^\*\/]$/{N;s,^+ \* .*,+ \* Comment removed,;}' patch > output
sed -e '/[^\*\/]$/{N;s,^+\\\* .*,+ \/\* Comment removed,;}' patch > output

注意第二个命令可能有点过于贪婪,但为了清理注释 - 这很有效!

工作原理:

1。)第一个命令 要确定这是否是评论的结尾/ [^ * /] $ /确定它是否为 /然后{N; s,^ + \ *。,+ / *注释被删除,;} '找到+ *(无论如何)并用*删除注释替换它。

2。)第二个命令 要确定这是否是评论的结尾/ [^ * /] $ /确定它是否为 /然后{N; s,^ + \ *。,+ / *注释被删除,;} '找到+ *(无论如何)并用*删除注释替换它。

3 个答案:

答案 0 :(得分:1)

正则表达式很精彩,但不是很精彩。

我会在创建补丁之前删除评论。

如果你不能这样做,我会申请补丁。从已修补和未修补的文件中删除注释,然后重新创建修补程序。

首先从x.h开始,我们将其编辑为x1.h并创建一个补丁:

diff -u x.h x1.h > patch

然后我们将补丁发布给有x.h的人。

cp x.h xnc.h
sed -e '/^\/\*/,/\*\//d' -i xnc.h
patch x.h patch
cp x.h xnc2.h
sed -e '/^\/\*/,/\*\//d' -i xnc2.h
diff -u xnc.h xnc2.h > patchnc

应创建免注释补丁。

但是如果我修补了未修补的源树,那么

find unpatched -exec sed -e ':^/\*:,:\*/:d' -i "{}" \;
find patched -exec sed -e ':^/\*:,:\*/:d' -i "{}" \;
diff -urN unpatched patched > patch

答案 1 :(得分:1)

我刚刚使用了一个快速而又脏的hackjob,它使用

封装了大部分注释
sed -e '/[^\*\/]$/{N;s,^+ \* .*,+ \* Comment removed,;}' patch > output
sed -e '/[^\*\/]$/{N;s,^+\\\* .*,+ \/\* Comment removed,;}' patch > output

答案 2 :(得分:0)

我不会使用正则表达式。一般来说,他们在一条线上工作。 并且您的文件将保留多行的评论。

我会用C / C ++或Java编写一个简单的解析器。

从状态0开始。

在状态0中,只需按字符读取(并输出),直到找到/ *

的序列

然后切换到状态1.

在状态1中,只读逐个字符(并且不要输出它),直到找到* /

的序列