我正在尝试从我们的补丁文件中删除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,^ + \ *。,+ / *注释被删除,;} '找到+ *(无论如何)并用*删除注释替换它。
答案 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中,只读逐个字符(并且不要输出它),直到找到* /
的序列