sed:如果下一行没有以}开头替换文本

时间:2011-11-04 17:18:59

标签: replace sed

我想替换; with,如果下一行不以}开头,并且下一行不为空。

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

例如

struct Point {
    float x;   
    float y;
};

应该像下面那样改变

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

通过sed进行的所有其他更改都有效,除了';'到','我真的没有任何想法如何继续这个.. :(

3 个答案:

答案 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可能不起作用!