Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.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
方法从修补程序文件中删除C注释_C_Patch_Strip_Utilities - Fatal编程技术网

方法从修补程序文件中删除C注释

方法从修补程序文件中删除C注释,c,patch,strip,utilities,C,Patch,Strip,Utilities,我正在尝试从我们的补丁文件中删除C注释,并查看了许多正则表达式,但如果我们从补丁中删除行,就会破坏它们 如何编写regex或sed命令来搜索diff补丁文件中的注释,并用空格替换注释行 sed regex适用于C文件,但对于修补程序,我需要一些不同的东西: sed '/^\/\*/,/\*\//d' 一个例子是: @@ -382,7 +391,109 @@ return len; } +/*******************************************

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

如何编写regex或sed命令来搜索diff补丁文件中的注释,并用空格替换注释行

sed regex适用于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,^+\*,+/*注释已删除,;}将查找+*(无论什么),并将其替换为*注释已删除

正则表达式很好,但没那么好

我会在创建补丁之前删除注释

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

因此,从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

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

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

从状态0开始

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

然后切换到状态1


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

为止。我刚刚使用了一个快速而肮脏的黑客作业,它使用

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

补丁文件是传入的,还是您正在生成它们?您想移动的是所有注释,还是只是在函数之间阻止注释?补丁文件已经创建,我正在寻找一种简单的方法来删除注释,或者至少将其清空。由于登台环境的原因,创建新补丁是一项艰巨的任务,它们的数量约为30+;这就是其中之一。您需要能够识别
/*
*/
/
标记,并相应地解析文件。就我个人而言,我会亲手破解我自己的过滤器来完成这样的工作;不应该超过几个小时。这是一个有点费时的过程。不幸的是,你知道一种方法,至少可以自动化其中的一部分吗?你应该能够编写脚本。为什么不在制作补丁之前做呢?@mcdoomington:你想删除所有评论,还是只删除补丁中出现的评论?对于只影响部分块注释的修补程序,您希望如何处理?有一些C注释剥离程序(我写了一些;我不是唯一一个这样做的人),我倾向于修改补丁生成过程,以便在创建补丁之前,新旧源代码都不会有不需要的注释。我同意它是可以编写脚本的,您可以使用许多可用的工具来实现这一点。问题在于内核src tarball中的源文件,然后是我如何处理它们的问题——一些快速而肮脏的东西;)编辑:原因是这是一个GPL版本-有人要求材料,它必须被清理。所以你只需要用sed走两棵树,然后创建补丁