我有一个用例,我试图在各种头文件中键入一组结构的定义
例如,我要转换它:
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之类的实用程序:
不幸的是,我所得到的最远的是:
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;
};
答案 0 :(得分:6)
假设结构定义中的文本既不包含{
也不包含}
,则以下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-用于命令行开关