我想将所有 C 注释打印到单独的文本文件中。
- 使用 awk、sed、grep 或 bash
- 输出 /* ... */ 之间的所有多行 C 注释(包含)
- 带有 // 注释的输出行
- 可选:打印行号
我尝试了这些解决方案,但它在 Ubuntu 上不起作用
我的请求的目的是能够快速使用源代码注释作为良好文档的起点。我不喜欢专用文档程序的额外混乱和专有嵌入式命令(即 Doxygen)。例如,正确注释每个源代码函数并删除表面的一行注释将节省大量时间,并提供近乎完整的参考。这也将鼓励更好的源代码注释。
我想将所有 C 注释打印到单独的文本文件中。
我尝试了这些解决方案,但它在 Ubuntu 上不起作用
我的请求的目的是能够快速使用源代码注释作为良好文档的起点。我不喜欢专用文档程序的额外混乱和专有嵌入式命令(即 Doxygen)。例如,正确注释每个源代码函数并删除表面的一行注释将节省大量时间,并提供近乎完整的参考。这也将鼓励更好的源代码注释。
已经有很多使用 shell-magic 的答案,但我认为通过使用您可能已经拥有的工具可以更容易地完成。即,海湾合作委员会。
diff -u <(gcc -fpreprocessed -dD -E main.c) main.c | grep '^+' | cut -c 2-
怎么运行的?
gcc -fpreprocessed -dD -E main.c
从文件中删除所有注释并将其放在标准输出上diff -u <(...) main.c
从 stdout 获取输入并将其与原始数据进行比较grep '^+'
过滤以 . 开头的所有行+
。换句话说:过滤之前确定的评论cut -c 2-
+
从输出中 删除符号不需要超级复杂的正则表达式、perl 或 awk 的东西,同时还涵盖其他答案可能错过的所有边缘情况。
如果您考虑以下因素,这并不像看起来那么微不足道:
puts("string with /*")
记住"
s 可以出现在 中ch = '"'
。或者续行:
或三字母组合。
为了涵盖这些,我们可以将此答案改编为相反的问题以使其打印而不是删除注释:
在另一个问题中的人为示例中,涵盖了大多数极端情况:
给出:
为了获取行号,因为我们在 slurp 模式下运行,其中主题是整个输入,而不是一次处理一行输入,所以有点棘手。我们可以通过使用
(?{code})
正则表达式运算符在每次找到行分隔符(C 中的 CR、LF 或 CRLF)时增加计数器来做到这一点:在同一个样本上给出:
可以按如下方式完成
awk
:将此脚本保存为
foo.awk
(或任何其他名称;扩展名是可选的),然后使用awk -f foo.awk input.c
. 该脚本将打印所有注释(由额外的换行符分隔),并在每个注释之前添加行号。好吧,绝对不是最奇特的,也不是最推荐的,因为它有一些缺陷。但我认为它看起来真的很酷: