【发布时间】:2012-05-11 17:12:01
【问题描述】:
我正在考虑尝试从我们的补丁文件中去除 C cmets,并查看了许多正则表达式,但如果我们从补丁中删除行 - 它会破坏它们。
您将如何编写正则表达式或 sed 命令来搜索差异补丁文件以查找 cmets 并用空格替换注释行。
这适用于 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
请注意,第二个命令可能有点过于贪婪,但出于清理 cmets 的目的 - 这行得通!
它是如何工作的:
1.) 第一个命令 要确定这是否是评论的结尾 /[^*/]$/ 确定它是否是 / 然后 {N;s,^+\* .,+ /* 已删除评论,;} ' 找到 +*(无论如何)并将其替换为 * 已删除评论。
2.) 第二个命令 要确定这是否是评论的结尾 /[^*/]$/ 确定它是否是 / 然后 {N;s,^+\* .,+ /* 已删除评论,;} ' 找到 + * (whatever) 并将其替换为 * Comment removed。
【问题讨论】:
-
补丁文件是进来的,还是你自己生成的?是要移动所有 cmets,还是只是在函数之间阻塞 cmets?
-
补丁文件已经创建,我正在寻找一种简单的方法来删除 cmets 或至少将它们清空。由于暂存环境,创建新补丁是一项艰巨的任务,它们的数量约为 30 多个。
-
有一点,正则表达式根本不够聪明或不够灵活,无法做你想做的事;这是其中一种情况。您需要能够识别
/*、*/和//令牌并相应地解析文件。就个人而言,我只是手动破解我自己的过滤器来完成这样的工作;不应该超过几个小时。