【发布时间】:2021-07-12 06:06:23
【问题描述】:
输入文件是这样的
#include <stdio.h>
int main()
{
// this is a function
float alpha = 0;
// test
/* */
int y = 11; // comment
y = y + 15;
//
char z = 'n';
/* end of file
c */
}
所需的输出应该是这样的
#include <stdio.h>
int main()
{
*
float alpha = 0;*
*
*
int y = 11; *
y = y + 15;*
*
char z = 'n';*
*
*
}
这里*代表EOL。
我已经尝试过了,但它也只是删除了空格和新行。
sed '/^[ \t]*\/\//d;/\/*\*\//d;/^[ \t]*\/\*/d' $[input file]
【问题讨论】:
-
恕我直言,专家始终建议使用了解代码格式样式的工具来编辑代码,可能是一些可以理解 C 格式的工具
sed可能会这样做,但您可能会遇到问题如果您的实际文件与显示的示例不同。 -
我需要做一个正则表达式,以便它可以删除任何C文件中的cmets
-
确保
const char *s = "foo // bar";不会破坏它。 -
这不是 K&R 的练习吗?除非没有正则表达式;大多数解决方案最终都会创建一个状态机 iirc。
-
任何使用
sed的通用解决方案或类似的基于正则表达式的解决方案都将与正则表达式看到注释而编译器没有的各种情况发生冲突。例如,printf("/* this is not a comment */");。变体包括'/*'、'*/'、'//'— 允许使用多字符字符常量,尽管值是实现定义的。那是在你开始处理反斜杠换行符之前。尽管很少有人这样做,但您可以使用反斜杠换行符跨行拆分注释开始或结束标记。此外,//cmets 由反斜杠换行符继续。