2017-10-02 5 views
0

Javaソースファイルがたくさんあり、ソース内の各クラスによって実装されているインターフェイスをリストしたいと思います。Javaソースファイルからインプリメントするインターフェイスを印刷する正規表現

クラスは

class SomeClass 
    implements 
     InterfaceC, 
     InterfaceD 
     { 

だから、基本的に、私が持つことができる場合は、複数行で宣言されたクラスが存在し、

class MyClass implements MyInterfaceA, MyInterfaceB { 

しかし1行で宣言されている場合に最良のケースがあります最初のimplements文字列リテラルと最初の文字の間のすべてを取り込める正規表現{、私は実装するインタフェースの名前を持っています。

私はgrep、pcregrep、sed、awkのようないくつかのツールを試してきましたが、最終的に動作するようなコマンドが1つありました。

pcregrep -M 'class[\s\S]*implements' 

あなたが見ることができるように、私は言葉classimplements間の出力すべてにしようとしていますし、私はimplements{間の出力すべてに同じ表現を変更すると、コマンドが行

class SomeClass 
    implements 

を出力ファイルには{が非常に多く、または{が特殊文字であるため、おそらく必要以上に出力します。

最初のimplementsと最初の{の間にテキストを出力するにはどうすればよいですか?

サンプルinput.javaファイル:GNU grepの

答えて

1

class MyClass implements MyInterfaceA, MyInterfaceB { 
} 
class SomeClass 
    implements 
     InterfaceC, 
     InterfaceD 
     { 
} 

仕事:

my_interfaces=$(grep -Poz '\bimplements[[:space:]]*\K[^{]*(?=\{)' input.java | tr -s '\n' ' ') 
echo "$my_interfaces" 

出力:

MyInterfaceA, MyInterfaceB InterfaceC, InterfaceD 
関連する問題