2011-11-04 40 views
0

我想替换;如果下一行不是以}开头,并且下一行不是空的。sed:如果下一行没有开始,则替换文本}

如果下一行以}开头或者它是空的那么;必须删除。

例如

struct Point { 
    float x; 
    float y; 
}; 

应当改变像下面

type something{ 
type record Point{ 
c_float x, 
c_float y 
}; 
} 

经由SED的所有其它更改除了该工作 ';'到 '' 我真的没有了想法如何继续这个.. :(

回答

1

使用awk,而不是sed的:

echo 'struct Point { 
    float x; 
    float y; 
};' | 
awk ' 
    $1 == "};" { 
     print prev 
     print 
     print "}" 
     in_struct = 0 
    } 
    in_struct { 
     if (prev) {print prev ","} 
     prev = $0 
     sub(/; *$/, "", prev) 
     sub(/float/, "c_&", prev) 
    } 
    $1 == "struct" { 
     print "type something {" 
     $1 = "type record" 
     print 
     prev = "" 
     in_struct = 1 
    } 
' 

输出

type something { 
type record Point { 
    c_float x, 
    c_float y 
}; 
} 
1
[[email protected]~/temp] cat file 
struct Point { 
    float x; 
    float y; 
}; 


[[email protected]~/temp] sed ' /^}\|^$/ s/;// ' file | sed 'N ; /}/! s/;/,/ ' | sed 'N ; /}/ s/;//' 
struct Point { 
    float x, 
    float y 
} 

的第一个sed迭代查找以“}”或空行开头并删除“;”的行,第二个sed迭代将新行加载到缓冲区检查中,如果它不包含“}”,则将“;”替换为“,”。迭代查找“}”并移除“;”。

1

这可能会实现:

a="SOMETHING" 
sed -r '/^struct\s*\S*\s*\{/,/^\};/s/^struct\s*(\S*)\s*\{/type '"$a"'{\ntype record \1\{/;s/^\};/&\n}/' input_file | 
sed -r '/^type '"$a"'\{/,/^\}/{//b;/^type/b;/^\};/!N;/.\n/{s/\s*/&c_/;/\n(\};|$)/{s/;//;ta};{s/;/,/}};:a;P;D};P;D' 

由于问题的性质,我发现最容易用来传递,它大概可以冷凝。

顺便说一句,这是完成GNU sed其他sed的可能无法正常工作!