我想替换; with,如果下一行不以}开头,并且下一行不为空。
如果下一行以}开头,或者它是空的那么;必须删除。
例如
struct Point {
float x;
float y;
};
应该像下面那样改变
type something{
type record Point{
c_float x,
c_float y
};
}
通过sed进行的所有其他更改都有效,除了';'到','我真的没有任何想法如何继续这个.. :(
答案 0 :(得分: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 :(得分:1)
[DoD@MBP-13~/temp] cat file
struct Point {
float x;
float y;
};
[DoD@MBP-13~/temp] sed ' /^}\|^$/ s/;// ' file | sed 'N ; /}/! s/;/,/ ' | sed 'N ; /}/ s/;//'
struct Point {
float x,
float y
}
第一个sed迭代查找以“}”或空行开头的行并删除“;”第二个sed迭代将新行加载到缓冲区检查中,如果它不包含“}”则替换为“;”至 ”,”。第三次迭代查找“}”并删除“;”。
答案 2 :(得分: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可能不起作用!