所以,鉴于我在一段代码中有一些类似的数据结构:
struct apple {
int type, color;
Apple app;
};
// ... more code
我想采用完整的结构定义(以及文件中的任何其他结构定义)并将它们压缩成一行(因此文件产品看起来像:
struct apple { int type, color; Apple app; };
)。
这是家庭作业的一部分。我刚刚在一周左右的讲座中学习过sed,而且我很不确定如何做这样的事情。因此,如果你觉得不舒服地回答事情,我会很感激,如果你能指出我正确的方向,这样我就可以学习如何正确使用这个实用程序。
我假设可以通过检测结构定义来完成sed的事情,然后继续将每一行读入全局缓冲区,直到找到}(我假设结构定义中没有联合或任何东西) )。虽然这个程序似乎有很多功能,但我找不到任何好的介绍。
答案 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///
命令,用任何东西替换换行符,即连接行。