使用sed检测和连接多线结构

时间:2011-10-07 20:07:38

标签: c unix sed

所以,鉴于我在一段代码中有一些类似的数据结构:

struct apple {
    int type, color;
    Apple app;
};

// ... more code

我想采用完整的结构定义(以及文件中的任何其他结构定义)并将它们压缩成一行(因此文件产品看起来像:

struct apple { int type, color; Apple app; };

)。

这是家庭作业的一部分。我刚刚在一周左右的讲座中学习过sed,而且我很不确定如何做这样的事情。因此,如果你觉得不舒服地回答事情,我会很感激,如果你能指出我正确的方向,这样我就可以学习如何正确使用这个实用程序。

我假设可以通过检测结构定义来完成sed的事情,然后继续将每一行读入全局缓冲区,直到找到}(我假设结构定义中没有联合或任何东西) )。虽然这个程序似乎有很多功能,但我找不到任何好的介绍。

2 个答案:

答案 0 :(得分:1)

可能有更好的方法来解决这个问题,例如awk也许是tr。但是既然你提到这是功课,而且必须由sed完成,我写了下面的命令(一个班轮:D)。注意,有两个“sed”命令。希望它能被接受。

解决问题的命令:

sed -rn '/^struct/{x;s/.*/#/g;x;p;n}; 
    /\};/ {x;/#/{s/#//;x;p;n}};
    x; /#/{x;p}' yourFile | sed -r ':a;N; s/\n//g;s/\};/&\n/g; ba;' 

现在让我们做一个测试,我创建了一个名为t.c的文件。看内容:

kent$  cat t.c
struct apple1 {
    int type, color;
    Apple app;
};

// ... more code
// ... more code
// ... more code
// ... more code
function abc(para){
 foo;
 bar;
 return ;
}
struct apple2 {
    int type, color;
    Apple app;
};

// ... more code
// ... more code
// ... more code 
struct apple3 {
    int type, color;
    Apple app;
};

// ... more code

现在用t.c baby播放我的sed命令:

kent$  sed -rn '/^struct/{x;s/.*/#/g;x;p;n}; 
        /\};/ {x;/#/{s/#//;x;p;n}};
        x; /#/{x;p}' t.c | sed -r ':a;N; s/\n//g;s/\};/&\n/g; ba;' 

struct apple1 {    int type, color;    Apple app;};
struct apple2 {    int type, color;    Apple app;};
struct apple3 {    int type, color;    Apple app;};

答案 1 :(得分:1)

我会做一些事情:

$ sed -n '/struct/,/};/p' input | sed -e ':a;N;$!ba;s/\n//g'
struct apple {    int type, color;    Apple app;};

构造/foo/,/bar/选择模式之间的所有行(包括)。

N命令将换行符和下一行附加到当前模式空间。然后执行着名的s///命令,用任何东西替换换行符,即连接行。