2016-12-23 16 views
0

これを含むcファイルからヘッダーを抽出する方法は?cファイルからヘッダー名を抽出する正規表現

#include <tema4header9.h> 
#include <tema4header3.h> 
#include <stdio.h> 
#include  <longnametest/newheader.h> 
#include <net/header.h> 
#include "last-test-Zhy3/DrRuheader.h" 
#include <last-test-8fF7/a5xyheader.h> 

私が使用してみました:

sed -n -e 's/#include[ \t]*[<"]\([^ \/<"]*\/[^ \/]*\)\.h[">]/\1\.h/p'

が、それは唯一のサブディレクトリ内のそれらのために動作します。また、私が入力した場合:

sed -n -e 's/#include[ \t]*[<"]\(([^ \/<"]*\/)+[^ \/]*\)\.h[">]/\1\.h/p'

または

sed -n -e 's/#include[ \t]*[<"]\(([^ \/<"]*\/)*[^ \/]*\)\.h[">]/\1\.h/p'

コマンドはもう動作しません。出力ファイルは次のようになります。

tema4header9.h 
tema4header3. 
stdio.h 
longnametest/newheader.h 
net/header.h 
last-test-Zhy3/DrRuheader.h 
last-test-8fF7/a5xyheader.h 
+0

あなたの予想される出力は何ですか? 'tema4header9.h'など。 – Inian

答えて

2

grep解決策:これはperlの正規表現を使用して#includeで始まる行に"<"または'"'の間に何かを印刷しています。

grep -oP '^#include.*(<|")\K.*(?=>|")' headers 
tema4header9.h 
tema4header3.h 
stdio.h 
longnametest/newheader.h 
net/header.h 
last-test-Zhy3/DrRuheader.h 
last-test-8fF7/a5xyheader.h 

あなたはawkとOKしている場合:

awk '/#include/{gsub(/<|>|"/,"",$2);print $2}' headers 
tema4header9.h 
tema4header3.h 
stdio.h 
longnametest/newheader.h 
net/header.h 
last-test-Zhy3/DrRuheader.h 
last-test-8fF7/a5xyheader.h 
+0

''(?<= "| \ <).*(?="|\>)' 'は' grep'のためには十分です。 – Inian

+0

@Inian 'cout <<" hey thereのように、 'file.c'の望ましくない行から何らかのデータを抽出するかもしれません。 "<< "x> y" << endl; '安全な尺度として' #include'が追加されました。リスクを判断するためのOPまで。 –

+0

私は引用符で囲まれた部分と '<'だけで部分を抽出することを前提に、前の部分が必要であることに同意します。 – Inian

0

これは動作するはずです:

sed -nr 's/#include\s+[<"]([^>"]+)[>"].*/\1/p' 
0

試してみてください。

awk '{match($0,/[<"].*[>"]/);print substr($0,RSTART+1,RLENGTH-2)}' Input_file 
関連する問題