Replace sed:如果下一行不是以}开头,则替换文本

Replace sed:如果下一行不是以}开头,则替换文本,replace,sed,Replace,Sed,我想替换;如果下一行不是以}开头并且下一行不是空的,则为 如果下一行以}开头或为空,则;必须删除 比如说 struct Point { float x; float y; }; 应该像下面这样改变 type something{ type record Point{ c_float x, c_float y }; } 除此“;”之外,通过sed进行的所有其他更改都有效我真的不知道如何继续下去(使用awk代替sed: echo 'struct Point {

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

如果下一行以}开头或为空,则;必须删除

比如说

struct Point {
    float x;   
    float y;
};
应该像下面这样改变

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

除此“;”之外,通过sed进行的所有其他更改都有效我真的不知道如何继续下去(

使用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
};
}

使用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
};
}
第一次sed迭代查找以“}”或空行开头的行并删除“;”,第二次sed迭代将新行加载到缓冲区检查中,如果它不包含“}”,则替换“;”到“,”。第三次迭代查找“}”并删除“;”

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

这可能有效:

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

这可能起作用:

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