Regex 一个衬板至c型结构
我有一个用例,我试图在不同的头文件中键入一组结构 例如,我想将其转换为:Regex 一个衬板至c型结构,regex,perl,sed,Regex,Perl,Sed,我有一个用例,我试图在不同的头文件中键入一组结构 例如,我想将其转换为: 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之类的实用程序来: 查找以“struct”开头的所有行 还记得上面示例中Fo
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;'
这种方法显然不起作用,但至少对我来说是一个开始
任何帮助都将不胜感激
谢谢
更新:
测试数据的一个例子是:
测试h
假设结构定义中的文本既不包含
{
也不包含}
,以下Perl oneliner将所有struct
声明转换为typedef
声明:
perl -0777 -pi -e 's!\bstruct\b\s+(\w+)\s*(\{.*?\})!typedef struct\n$2 $1!sg'
-0777
-将文件作为一个整体写入$\uu
-pi
-就地编辑文件
-e
-使用此Perl代码
s!\bstruct\b\s+(\w+)\s*(\{.*?\})!typedef struct\n$2 $1!sg
将所有struct
替换为C标识符,然后将{
..}
替换为typedef struct
,然后替换大括号和填充物,然后替换标识符。有关详细信息,请参阅
另见
-用于解释正则表达式部分
-对于命令行开关您的
结构
是否包含(成对的){
或}
?否则,以下内容基本上应该可以工作:perl-0777-pi-e的\b结构\b\s+(\w+)\s*(\{.*?\})!typedef结构\n$2$1!s'*.c
(另请参见@Corion:我也做了同样的事情,但我有一个问题。我们如何使用Perl或Python使用捕获的组。例如,有没有任何方法可以使用Python提取上述实现的解决方案?@Deep-我在上面的Perl中使用捕获的组。对于Python,您可以通过m=re.search(…);print m.groups(1)访问它们
-请参阅或将其作为(副本)发布问题这非常有帮助。谢谢你链接到regex站点!我注意到一件奇怪的事情,如果我的头中有多个结构,perl命令只修改第一个结构。我在问题中添加了一个测试文件以进行演示。在上面的示例中,我使用了你的命令并通过了包含3个结构定义的test.h上面提到的。perl-0777-pi-e's!\bstruct\b\s+(\w+)\s*(\{.*?\})!typedef struct\n$2$1!s'test.h。我猜我只需要一个“全局”参数,这样文件中的所有结构都可以在?Awesome上操作。效果非常好。谢谢!
s!\bstruct\b\s+(\w+)\s*(\{.*?\})!typedef struct\n$2 $1!sg