用sed将(单行)C注释替换为C++注释

5

我可以用sed命令将源文件中的所有C语言风格的注释替换为C++语言风格的注释。

以下是需要替换的文本:

int main() {
  /* some comments */
  ...

to:

int main() {
  // some comments
  ...

所有评论都是单行的,代码中没有这样的评论:
int f(int x /*x-coordinate*/ );

所以我尝试了这个:

 sed -i 's/ \/\* .*  \*\ / \/\/* /g' src.c

但它不会改变文件本身。这篇文章类似,但我正在尝试理解sed的表达式语法。由于“.”匹配任何字符,“ * ”匹配零个或多个某种模式,我认为“.*”匹配任意数量的任何字符。

这是我第一次听到“C注释”和“C++注释”的名称。 - Alvin Wong
1个回答

6
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

它是一个分隔符。命令“s”后面的下一个字符被称为分隔符,可以是任何字符。例如,如果要替换的字符串包含“/”,则插入“/”作为分隔符是不好的,因为在这种情况下,我将被迫用反斜杠引用“/”。在这种情况下,我使用了“:”。 - alinsoar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接