用 sed 删除所有 C 注释

Daw*_*awn 10 sed text-processing

我正在尝试编写一个脚本,该脚本将删除当前目录中 C 文件内部的所有注释和所有内容。我一直在使用sed,这是我到目前为止所拥有的:

sed -i '/ * [^()] */d' *.c
Run Code Online (Sandbox Code Playgroud)

当注释与星号或反斜杠在同一行时,这会起作用。

但是,当注释行没有斜线或星号时,它不起作用。

我知道 sed 是一行一行的,我只是不知道如何告诉它继续删除,直到它看到*/.

Sté*_*las 9

在不使用真正的 C 预处理器的情况下删除注释并非微不足道。我曾经想过这样的事情

perl -0777 -pe'
 s{
     /\*.*?\*/
   | //[^\n]*
   | (
        "(?:\\.|.)*?"
      | '\''(?:\\.)?.*?'\''
      | \?\?'\''
      | .[^'\''"/]*
     )
  }{if ($1eq""){" "}else{$1}}exsg' 
Run Code Online (Sandbox Code Playgroud)

这应该涵盖大多数情况,例如:

printf("%c%c%s", '"' /* d-quote */, '\'', "/*" "*/");
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅那里的有趣讨论。


Jos*_* R. 4

如果这不必在 中完成sed,那么您可以使用 perl 轻松完成:

perl -p0i -e 's#/\*.*?\*/##sg' *.c
Run Code Online (Sandbox Code Playgroud)

请注意,这将删除根本不属于注释的带引号字符串的部分,如下面注释中的示例所示。

  • 这失败得相当惊人。试试这个: `echo 'printf("C 中的注释是这样写的 /* 像这样 */.\n");' | perl -p0i -e 's#/\*.*?\*/##sg'` (3认同)