我有许多cmake头文件,我想将其中的注释和cmakedefine提取到CSV(或TSV)文件中.

典型的输入如下所示:

/**
 * 1st Multi-line brief description of what the following 
 * cmakedefine does.
 *
 * Second more complicated multi-line full description, of <c>SOMETHING</c> to be enabled in the
 * configuration.
 *
 * Possibly additional lines of full description.
 */
#cmakedefine SOMETHING

第一步要得到的输出如下:

SOMETHING
1st Multi-line brief description of what the following cmakedefine does.
Second more complicated multi-line full description , of <c>SOMETHING</c> to be enabled in the configuration. Possibly additional lines of full description.
...

最终,我希望得到的结果是:

SOMETHING, "1st Multi-line brief description of what the following cmakedefine does.", "Second more complicated multi-line full description, of <c>SOMETHING</c> to be enabled in the configuration. Possibly additional lines of full description."

SOMETHING_ELSE, "Brief description", "Long Description"

(列标题可以隐含为:cmakedefine, Brief_Description, Long_Description.)

我曾try 在sed分钟内做到这一点,但没有成功,这不是一种消磨时间的好方法.我也try 过awk,但没有成功.在这一点上,我并不关心使用什么工具,我只想完成工作.但我认为也许可以更好地使用Python来实现这一点.

注意事项:

  • 所有 comments 都以空的/**开头.
  • 所有Brief条 comments 都以\ * \ 开头,可能在多行.
  • BriefLong comments 用空的注释行\ *分隔.
  • 所有Long条 comments 都可以有多个段落(如图所示),方式类似.
  • 相关的cmakedefine人正在关注 comments .

推荐答案

在AWK中看起来很不错,总体来说,复杂性取决于输入的不同.这里有一些东西可以让你开始:

awk '
gsub(/^ \* */, "") {
    if ($0 == "/") {
        // end - to nothing
    } else if ($0) {
        comment = comment (comment ? " " : "") $0;
    } else if (!firstline) {
        firstline = comment
        comment = ""
    }
}
gsub(/^#cmakedefine /, ""){
    print $0 ", \"" firstline "\", \"" comment "\"";
    fistline = 0
    comment = ""
}
' <<EOF
/**
 * 1st Multi-line brief description of what the following 
 * cmakedefine does.
 *
 * Second more complicated multi-line full description <c>SOMETHING</c> to be enabled in the
 * configuration.
 *
 * Possibly additional lines of full description.
 */
#cmakedefine SOMETHING
EOF

输出:

SOMETHING, "1st Multi-line brief description of what the following  cmakedefine does.", "Second more complicated multi-line full description <c>SOMETHING</c> to be enabled in the configuration. Possibly additional lines of full description."

这是一个很好的awk教程https://www.grymoire.com/Unix/Awk.html

下一步是添加一些状态,比如不输出空注释,也许用一些正则表达式清除更多的输入,正确引用csv或tsv或您想要的格式,并随着复杂性的增加回答为什么不是python和json.

Python相关问答推荐

如何修复使用turtle和tkinter制作的绘画应用程序的撤销功能

Python -根据另一个数据框中的列编辑和替换数据框中的列值

将HTML输出转换为表格中的问题

对Numpy函数进行载体化

追溯(最近最后一次调用):文件C:\Users\Diplom/PycharmProject\Yolo01\Roboflow-4.py,第4行,在模块导入roboflow中

如何在Windows上用Python提取名称中带有逗号的文件?

如果值不存在,列表理解返回列表

切片包括面具的第一个实例在内的眼镜的最佳方法是什么?

如何使用它?

如何获取numpy数组的特定索引值?

将tdqm与cx.Oracle查询集成

Pandas计数符合某些条件的特定列的数量

Python Pandas获取层次路径直到顶层管理

如何在达到end_time时自动将状态字段从1更改为0

如何在PySide/Qt QColumbnView中删除列

Python Tkinter为特定样式调整所有ttkbootstrap或ttk Button填充的大小,适用于所有主题

在输入行运行时停止代码

找到相对于列表索引的当前最大值列表""

通过追加列表以极向聚合

查看pandas字符列是否在字符串列中