私はするだろう:
sed -e 's/\s*\([_a-zA-Z][0-9a-zA-Z_]*\)\s*=\s*(\s*struct\s*\([_a-zA-Z][0-9a-zA-Z_]*\)\s*)\s*{\s*\([^}]*\)}\s*;/init_\2( \&\1, \3);/' -i you_file.c
クレイジー正規表現の説明:
1) \s* は 0 個以上の空白をスキップします (より柔軟になります)。
次に、( ) を使用して C 識別子を取得します (間違っていたら誰か訂正してください) アルファベットまたはアンダースコアの文字で開始でき、英数字とアンダースコアを含めることができます ([ a-zA-Z ][0-9a-zA-Z ]*)。
3 番目に、等号の後に 0 個以上のスペースが続くのをスキップし、次に左括弧の後にスペースが続き、構造体の後にスペースが続くのをスキップします。
4 番目: 別の識別子を取得する
5 番目: 0 個以上のスペースで囲まれた閉じ括弧をスキップし、次に空白が続く開き括弧をスキップします。
6 番目: 閉じ括弧の前にあるものをすべて取得します (これに注意してください! コード内に括弧を含む式を含めることはできません)。
7番目: 閉じ括弧、空白、セミコロンをスキップ
最後に: 掴んだものを再配置 =)
編集:「&」は「\&」のようにエスケープする必要があることに注意してください。そうでない場合、sed はそれをマッチ全体に置き換えます。
EDIT2:任意の数の初期化子(コンマ付き)を含める方法に関連する観察についてJonathanに感謝します
お役に立てれば、
ジャニート