0

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

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

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

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

一个示例补丁摘录是:

@@ -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,^+\* 。,+ /* Comment removed,;}' 找到 + * (whatever) 并将其替换为 * Comment removed。

4

3 回答 3

1

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

sed -e '/[^\*\/]$/{N;s,^+ \* .*,+ \* Comment removed,;}' patch > output
sed -e '/[^\*\/]$/{N;s,^+\\\* .*,+ \/\* Comment removed,;}' patch > output
于 2012-08-10T17:04:52.460 回答
1

正则表达式很美妙,但没那么美妙。

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

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

因此,从 xh 开始,我们将其编辑为 x1.h 并创建一个补丁:

diff -u x.h x1.h > patch

然后我们将补丁发布给拥有 xh 的人

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
于 2012-05-11T17:18:24.587 回答
0

我不会使用正则表达式。一般来说,他们在一条线上工作。您的文件将包含跨越多行的注释。

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

从状态 0 开始。

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

然后切换到状态 1。

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

于 2012-05-11T17:58:49.467 回答