0

構造体を初期化する入力に数行あります。例えば:

head = (struct node) {5, NULL};

これらの行を次のように変換する必要があります。

init_node( &head, 5, NULL);

つまり...入力ファイルに次の行が表示されるたびに:

something = (struct something2){ something3, something4};

私はそれを次のように変換する必要があります:

init_something2( &something1, something3, something4);

ここで sed 関数を使用する必要があると思います。誰か助けてくれませんか?? ありがとう

4

4 に答える 4

1

Sed もおそらく動作しますが、perl で動作するものを次に示します。

perl -pe 's|(.*) = \(struct node\) {(.*), (.*)};|init_node( &\1, \2, \3);|'

括弧内の表現でそれぞれの「何か」をキャプチャし、代わりに \1、\2 などを使用してそれらを取得していることに注意してください。それはあなたが本当に知る必要がある唯一の部分です. いずれかの式を実際のデータに適合するように柔軟にする方法を理解できることを願っています (奇跡的にすべての行に一貫したスタイルがない限り)。

于 2012-09-20T22:12:31.427 に答える
1

私はするだろう:

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に感謝します

お役に立てれば、

ジャニート

于 2012-09-20T22:19:07.160 に答える
0

ここでは正規表現が役に立ちます (入力が一貫した形式であると仮定します)。

\([a-zA-Z]*\) = (struct \([a-zA-Z]*\)) {\([a-zA-Z0-9, ]*\)};は、入力文字列をモデル化する必要があります。これらのキャプチャ グループを使用して、式init_\2( \&\1, \3);は目的の出力文字列を生成する必要があります。これらをまとめると、次のsedコマンドで必要なことを実行できます。

sed -e 's/\([a-zA-Z]*\) = (struct \([a-zA-Z]*\)) {\([a-zA-Z0-9, ]*\)};/init_\2( \&\1, \3);/g'

structこれは、変数名が大文字と小文字のみで構成されていることを前提としています(例がページに対して大きくなりすぎないように、単純にしました)。他の文字が含まれている場合は、それに応じて式を調整する必要があります。

于 2012-09-20T22:12:58.123 に答える
0

より一般的な sed マッチ:

sed -e 's/\([a-zA-Z0-9]*\)\s*=\s*(\s*struct\s\([a-zA-Z0-9]*\)\s*)\s*{\s*\([a-zA-Z0-9]*\)\s*,\s*\([a-zA-Z0-9]*\)\s*}\s*;/init_\2( \&\1, \3, \4);/g'

これは、次のような表現に一致します。

  • something=( struct something2) {something3,something4};
  • something = (struct something2) { something3 , something4 };

于 2012-09-20T22:16:12.837 に答える