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