awk:ヘッダファイルの列挙ブロック内でコードブロックを一致させる

awk:ヘッダファイルの列挙ブロック内でコードブロックを一致させる

列挙内の#ifdefを削除するためにC ++ヘッダーを解析しようとしています。私が使用している headerParser モジュールに #ifdef を含む列挙型をスキップするバグがあるため、これが必要です。

ファイルを収集して準備するシェルスクリプトがあります。その後、Pythonスクリプトが呼び出され、最終出力が生成されます。 Pythonファイルは一般的なので、シェルスクリプト内で "#ifdef"ブロックを削除するだけです。

テキスト部分は次のとおりです。

  typedef enum fixedsample
{
element 1,
element 2,
element 3,
#ifdef XYZ
element 4,
element 5,
#endif
} FIXEDNAME;

ifdefはその要素を必要としないので、削除する必要があります。また、列挙名 "fixedsample" と "FIXEDNAME" はすべてのファイルに対して正確で変更されません。

この目的でawkを使用できますか?どんな助けでも大変感謝します。

編集:「typedef enum ConstantName」と「}CONSTANT;」がすべてのファイルに表示されます。したがって、#ifdefはそのブロック内でのみ検索できます。他の#ifdefは削除されません。

ベストアンサー1

awkこれは範囲とフラグを使用して行うことができます。たとえば、次のようになります。

awk '/enum fixedsample/,/} FIXEDNAME/ { e=1 } e && /^#ifdef/,/^#endif/ { next } { e=0; print }' foo.hpp

このsedバージョンにはフラグも必要なく、入れ子になった範囲のみが必要なため、範囲#ifdef ... #endif内のすべての範囲が削除されenum ... }ますd

sed '/enum fixedsample/,/} FIXEDNAME/{; /^#ifdef/,/^#endif/d; }' foo.hpp

実際のバージョンでは、誤検出の可能性を減らすために、より正確なモードを使用する必要があります。

おすすめ記事