コードのブロック内の文字列を含むファイルの名前 (もちろん改行を含むことができます)、またはより具体的には、コンストラクター内の特定のメソッド呼び出し ( methodNameと呼びましょう) を見つける必要があります。現在のディレクトリとそのサブディレクトリにあるすべての Java コード ファイルを調べる必要があります。
考えられる一致は次のとおりです。
public myClass() {
a(1);
b();
myMethod("abc");
c(5);
}
これは私がこれまでに思いついた表現です:
find . -name *.java | xargs nawk '{print $0 "~("FILENAME")"}' | tr -d "\n" | grep -s -i -o 'public \w\+([^)]*).*methodName([^~]*~([^)]*)'
つまり...
- *.java ファイルは再帰的に検出されます
- 各行が出力され、その横にそれが属するファイル名が表示されます (検出された場所を追跡するため)
- grep を使用できるように \n が削除されますブロック内
- methodNameが検索されます。
問題は、.* を使用する必要があるたびに、式を次の式の否定に変更し、次に次の式に変更する必要があることです。例: if I need .*\~
, I need to do ([^~]*~
... それは良くありませんが、我慢できます。その文字列を否定することはより苦痛になるため、問題はmethodNameに付属しています。
何か案は?正規表現でそれを行うことはできますか?