使用sed查找并连接行

时间:2012-09-19 19:32:21

标签: shell unix

我在一个长c文件中有一个struct块

struct node {
   int val;
   struct node *next;
};

如何使用sed函数查找此结构块并将其转换为一行。所以它看起来像这样:

struct node {   int val;   struct node *next;};

提前致谢


我的意见是:

struct node {
   int val;
   struct node *next;
};

typedef struct {
   int numer;
   int denom;
} Rational;

int main()
{
struct node head;
Rational half, *newf = malloc(sizeof(Rational));

head = (struct node){ 5, NULL };
half = (Rational){ 1, 2 };
*newf = (Rational){ 2, 3 };
}

我的输出是:

struct node { int val; struct node *next;};

typedef struct { int numer; int denom;} Rational;int main(){struct node head;Rational  half, *newf = malloc(sizeof(Rational));head = (struct node){ 5, NULL };
half = (Rational){ 1, 2 };
*newf = (Rational){ 2, 3 };
}

我只想要结构节点:struct node { int val; struct node *next;};
和typedef结构:typedef struct { int numer; int denom;} Rational; 在一条线上。但是,将main()附加到Rational的末尾;

我希望main函数中的东西保持不变。

1 个答案:

答案 0 :(得分:3)

使用sed:

sed '/struct[^(){]*{/{:l N;s/\n//;/}[^}]*;/!t l;s/  */ /g}' input.c

sed看到结构定义(/struct[^{]*{/)时,它会读取行,直到};在一行(:l N;s/\n//;/[}];/!t l;)上看到,同时删除换行符。当它与};匹配时,会删除多余的空格(;s/ */ /g)。