如何使用sed将源文件中的所有C风格注释替换为C ++风格。
所有这些:
int main() {
/* some comments */
...
为:
int main() {
// some comments
...
所有评论都是单行,而且代码之间没有这样的评论:
int f(int x /*x-coordinate*/ );
所以我尝试了这个:
sed -i 's/ \/\* .* \*\ / \/\/* /g' src.c
但它保持文件不变。 This帖子类似,但我试图了解sed的表达式语法。自“。”匹配任何字符,“*”匹配某些模式的零个或多个。我假设“。*”匹配任何数字的任何数字。
答案 0 :(得分:5)
sed -i 's:\(.*\)/[*]\(.*\)[*]/:\1 // \2:' FILE
这将改变每一行:
aaa /* test */
成这样的一行:
aaa // test
如果您对同一行有更多评论,则可以应用此更复杂的解析器,转换如下行:
aaa /* c1 */ bbb /* c2 */ ccc
到
aaa bbb ccc // c1 c2
sed -i ':r s:\(.*\)/[*]\(.*\)[*]/\(.*\):\1\3 //\2:;tr;s://\(.*\)//\(.*\)://\2\1:;tr' FILE
更复杂的情况是当你在一行的字符串中有注释时,就像在call("/*string*/")
中一样。这是一个脚本c-comments.sed
,用于解决此问题:
s:\(["][^"]*["]\):\n\1\n:g
s:/[*]:\n&:g
s:[*]/:&\n:g
:r
s:["]\([^\n]*\)\n\([^"]*\)":"\1\2":g
tr
:x
s:\(.*\)\n/[*]\([^\n]*\)[*]/\n\(.*\)$:\1\3 // \2:
s:\(.*\)\n\(.*\)//\(.*\)//\(.*\):\1\n\2 //\4\3:
tx
s:\n::g
您将此脚本保存到文件c-comments.sed中,并将其称为:
sed -i -f c-comments.sed FILE