前提・実現したいこと
C++ のソースコードのプリプロセッサ命令の箇所のみを抽出して、ファイル毎に出力したい。
発生している問題・エラーメッセージ
sed コマンドを使って、「#」を含まない行を削除したいのですが、
扱いに慣れておらず、どのように表現すべきか悩んでいます。
該当のソースコード
例を以下に示します。
置換前 (sample.cpp)
cpp
1/* sample.cpp */ 2#include "sample.h" 3#define MACRO_A 4#ifndef MACRO_A 5#define MACRO_B 6#endif 7#define MACRO_C 8#undef MACRO_C 9/* 10#define MACRO_E 11*/ 12 13int main(void) 14{ 15 return 0; 16} 17
置換後 (sample.cpp.tmp)
cpp
1 2#include "sample.h" 3#define MACRO_A 4#ifndef MACRO_A 5#define MACRO_B 6#endif 7#define MACRO_C 8#undef MACRO_C 9 10#define MACRO_E 11 12 13 14 15
※置換前にコメント行は事前に削除しているため、
「/」と「/」と「//」は考慮しなくて構いません。
試したこと
下記条件で一致した行を削除しようとしましたが、
sed コマンドが否定先読みに対応していなかったため、諦めました。
置換前:^(?!\s*#).*$ 置換後:(入力無し)
以下のような利用を考えており、
どのように否定を表現するのかわからず、滞っています。
cd (cpp ファイルと h ファイルが格納されているフォルダ) for file in `find . -name '*.cpp' -or -name '*.h'`; do sed -i "s/(パターン)//g" $file # ここに記載するパターンに悩んでいます。 done
補足情報(FW/ツールのバージョンなど)
OS:Ubuntu20.04
回答3件
あなたの回答
tips
プレビュー