我正在尝试编写一个脚本,该脚本将删除当前目录中 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
请注意,这将删除根本不属于注释的带引号字符串的部分,如下面注释中的示例所示。