【问题标题】:One liner to typedef c structuretypedef c结构的一个衬里
【发布时间】:2019-05-31 08:36:21
【问题描述】:

我有一个用例,我试图在各种头文件中对一组结构进行类型定义

例如,我想转换这个:

struct Foo_t
{
   uint8_t one
   uint8_t two;
   uint8_t three;
};

到这里:

typedef struct
{
   uint8_t one
   uint8_t two;
   uint8_t three;
} Foo_t;

概括地说,我想使用 sed、awk 或 perl 等实用程序来:

  1. 查找所有以“struct”开头的行
  2. 记住后面的结构标签,在上面的例子中,Foo_t
  3. 找到第一个花括号“{”
  4. 跳过 n 个新行,直到第一次出现右括号 “}”
  5. 插入结构标签(Foo_t)或任何特定结构 叫
  6. 插入分号结束结构定义

不幸的是,我得到的最远的是以下:

find . -regextype egrep -path ./dont_touch -prune -o -name "*.h" -print0 | xargs -0 sed -i 's/struct* /typedef struct /g;'

这种方法显然行不通,但它至少是我的一个起点。

任何帮助将不胜感激。

谢谢!

更新:

测试数据的一个例子是:

test.h

struct Foo_t
{
   uint8_t one;
   uint8_t two;
   uint8_t three;
   uint8_t four;
};

struct Bar_t
{
   float_t one;
   float_t two;
};

struct Baz_t {
   float_t one;
   float_t two;
};

【问题讨论】:

  • 您的structs 会包含(配对){} 吗?否则,以下应该基本上可以工作:perl -0777 -pi -e 's!\bstruct\b\s+(\w+)\s*(\{.*?\})!typedef struct\n$2 $1!s' *.c(另见regex101
  • @Corion:我做了同样的事情,但我有一个问题。我们如何使用 Perl 或 Python 使用捕获的组。有没有什么方法可以使用 Python 提取上述实现的解决方案?
  • @Deep - 我在上面的 Perl 中使用捕获的组。对于 Python,您可以通过 m = re.search(...); print m.groups(1) 访问它们 - 请参阅 Python regex documentation 或将其作为(重复)问题发布

标签: regex perl sed


【解决方案1】:

假设结构定义中的文本既不包含{ 也不包含},以下Perl oneliner 会将所有struct 声明转换为typedef 声明:

perl -0777 -pi -e 's!\bstruct\b\s+(\w+)\s*(\{.*?\})!typedef struct\n$2 $1!sg' 

-0777 - 将文件作为一个整体放入$_

-pi - 就地编辑文件

-e - 使用这个 Perl 代码

s!\bstruct\b\s+(\w+)\s*(\{.*?\})!typedef struct\n$2 $1!sg

将所有struct 替换为C 标识符,然后将{ ... } 替换为typedef struct,然后是大括号和其他内容,然后是标识符。详情请见regex101

另见

perlre - 正则表达式部分的解释

perlrun - 用于命令行开关

【讨论】:

  • 这非常有帮助。并感谢您提供指向正则表达式网站的链接!我注意到一件奇怪的事情,如果我在标题中有超过 1 个结构,perl 命令只会修改第一个结构。我在我的问题中添加了一个测试文件以进行演示。在上面的示例中,我使用了您的命令并通过了包含上述 3 个结构定义的 test.h。 perl -0777 -pi -e 's!\bstruct\b\s+(\w+)\s*(\{.*?\})!typedef struct\n$2 $1!s' test.h。我猜我只需要一个“全局”参数,以便对该文件中的所有结构进行操作?
  • 太棒了。奇迹般有效。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多