2011-11-04 39 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的可能無法正常工作!