gpt4 book ai didi

regex - 一个 typedef c 结构的衬里

转载 作者:行者123 更新时间:2023-12-02 08:03:44 25 4
gpt4 key购买 nike

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

例如,我想将其转换为:

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. 记住后面的struct标签,在上面的例子中,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;
};

最佳答案

假设结构定义中的文本既不包含 { 也不包含 },以下 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

typedef struct 替换所有 struct 后跟 C 标识符,然后 { ... },然后是大括号和其他东西,然后是标识符。参见 regex101了解详情。

另见

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

perlrun - 用于命令行开关

关于regex - 一个 typedef c 结构的衬里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54044583/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com