Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 一个衬板至c型结构_Regex_Perl_Sed - Fatal编程技术网

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之类的实用程序来:

  • 查找以“struct”开头的所有行
  • 还记得上面示例中Foo\u t后面的struct标记吗
  • 找到第一个大括号“{”
  • 跳过n行新行,直到第一次出现右括号 “}”
  • 插入结构标记(Foo_t)或任何特定结构 叫
  • 插入分号以结束结构定义
  • 不幸的是,我得到的最远信息如下:

    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