使用 sed 删除所有 C 注释

使用 sed 删除所有 C 注释

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

sed -i '/ * [^()] */d' *.c

当注释与星号或反斜杠位于同一行时,此方法有效。

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

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

答案1

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

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

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

printf("%c%c%s", '"' /* d-quote */, '\'', "/*" "*/");

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

答案2

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

perl -p0i -e 's#/\*.*?\*/##sg' *.c

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

相关内容