2012-09-21 80 views
1

我輸入的內容包含用typedef定義的結構。 我後來用這些來初始化我主函數中的變量。用sed編輯一行

例如:

typedef struct { 
    int numer; 
    int denom; 
} Rational; 

int main() 
{ 
Rational half, *newf = malloc(sizeof(Rational)); 

half = (Rational){ 1, 2 }; 
*newf = (Rational){ 2, 3 }; 
} 

這是我想做的事: 我想這兩個初始化線轉換成函數調用。

例如:

half = (Rational){ 1, 2 }; 

應該變成:

init_Rational(&half, 1, 2 ); 

*newf = (Rational){ 2, 3 }; 

應該變成

init_Rational(newf, 2, 3 ); 

訣竅是記住Rational早期定義爲struct,並用函數調用替換初始化。它不必稱爲Rational,它可以是任何名稱。

一旦它確認該聲明是一個struct typedef,它應該按照上面所示執行以下操作。

轉到:

something = (someStructName){ data1, data2, data3.. }; 

init_someStructName(&something, data1, data2, data3..); 

或爲指針...打開:

*something = (someStructName){ data1, data2, data3.. }; 

init_someStructName(something, data1, data2, data3..); 

有人可以幫助我嗎?謝謝!

回答

1

這是一個相當棘手的問題,因爲需要動態檢測結構名稱意味着您不能提前寫入整個正則表達式。

這是一個潛在的解決方案,假設你的文件名是foo.c的:

sed -n '/^typedef struct/,/^}/{/^}/{s/.* \(.*\);/\1/p}}' foo.c | xargs -I {} sed -i -e 's/^\(\s*\)\*\(\w*\) = ('{}'){\(.*\)};/\1init_'{}'(\2,\3);/' -e 's/^\(\s*\)\(\w*\) = ('{}'){\(.*\)};/\1init_'{}'(\&\2,\3);/' foo.c 

但這一次通過與sed由自己打印出的每個結構的名字上線,然後使用xargs構建一個額外的sed命令爲每個結構在文件上執行替換。

如果你的的sed版本不支持\s\w快捷鍵,可以使用[ \t]代替\s[_a-zA-Z0-9]而不是\w

0

幾乎不可讀!

sed -e 's/\(\**[a-zA-Z_][a-zA-Z_0-9]*\) *= *(*\([a-zA-Z_][a-zA-Z_0-9]*\) *) *{\([^}]*\)} *;/init_\2(\&\1,\3);/' 

注:這是一個單行 注2:我認爲有可能是唯一的空間儘可能分隔符(無TAB) 注3:本表「*x」保持不變,因爲它轉化爲&*x,這是正確的。我假定「*」和標識符之間沒有空格,

+0

我認爲其中一個要求是替換隻能在與初始化相同的文件內部定義的結構中完成。 –