メソッド名を抽出して、ロガーにメソッドの最初の行に追加します。

メソッド名を抽出して、ロガーにメソッドの最初の行に追加します。

メソッドの最初の行ロガーにJavaメソッド名を追加する必要があります。

次のアプローチを試しています。

  1. キーワードまたはおよび文字を含む行をprivate取得protectedpublicます(。これはメソッド定義を識別します。
  2. 抽出方法名
  3. メソッド名が見つかったら、2 行の後に新しい行を追加して追加します。
    Logger.add(Constants.METHOD_name, "name of the method")
    
    ここで、「メソッド名」は、手順2で抽出した名前です。

以下のコードを試しました。

#! /bin/bash

arr=($(grep -E 'public|private|protected' DataServiceImpl.java | grep "(" | awk '{print$3}' | awk -F'(' '{print $1}'))

for (( i=0; i<${#arr[@]}; ++i )); do
   sed "/${arr[$i]}(/{N;a Logger.add(Constants.METHOD_NAME,\"${arr[$i]}\");
   }" DataServiceImpl.java > changedText.txt && mv changedText.txt DataServiceImpl.java
done

良い結果。しかし、問題は、Logger.add呼び出し行の後に新しい行を挿入することです。

public String getProtocol()たとえば、次の行を追加するメソッドがある場合

Logger.add(Constants.METHOD_NAME,"getProtocol")

メソッド定義の最初の行。また、呼び出される場所に追加しますgetProtocol()

この状況を避ける方法は?私たちがこのようなことをする方法はありますか?

#! /bin/bash

arr=($(grep -E 'public|private|protected' DataServiceImpl.java | grep "("))

for (( i=0; i<${#arr[@]}; ++i )); do

//search for match of array element. This would result in complete line till (
//If match found, add a line after two lines and add the below code.
//Extract 3rd column of array element. In public String getProtocol, we will get getProtocol
//Logger.add(Constants.METHOD_NAME, "extracted column")
done

Javaクラスの例:

public class DataServiceImpl
   {
     public String getProtocol()
     {
        return "https";
     }
     public String buildUrl()
     {
       String url = getProtocol()+"://www.google.com";
       return url;
     }
}

予想される結果:

public class DataServiceImpl
   {
     public String getProtocol()
     {
        Logger.add(Constants.METHOD_NAME,"getProtocol");
        return "https";
     }
     public String buildUrl()
     {
       Logger.add(Constants.METHOD_NAME,"buildUrl");
       String url = getProtocol()+"://www.google.com";
       return url;
     }
}

Logger.addまた、下に行を追加するように指定{し、ソートの後にスペースを追加するように指定する方法がある場合は役立ちます{。ありがとうございます。

答え1

私たちは拡張正規表現モードでGNU sedを使用します(正規表現の作成をある程度簡単にするため):PS:これはパーサーではないため、時にはいくつかの極端なケースが発生することがあります。

$ sed -re '
    /^\s*(public|private|protected)\s.*[(]/!b
    h;s/\S+/\n/2;s/.*\n\s+//;s/[(].*//



  s/.*/Logger.add(Constants.METHOD_NAME,"&");/
    x;n;n;x;G
    s/.*\n(\s*).*/\1&/
' file.java

方法: 関心のある行を分離します。次に、メソッド名を取得し、目的のロギング用語で装飾します。その後、2行をスキップして印刷します。

答え2

たとえば、GNU awkを使用して3番目の引数をmatch()、gensub()、および\ s / \ Sの頭字語で一致させるなど、awkを使用する方が簡単で、よりきれいで、移植性に優れています。

$ cat tst.awk
match($0,/(private|protected|public).*\s(\S+)\s*\(/,a) {
    methodName = a[2]
    lineNr = NR+2
}
NR == lineNr {
    indent = gensub(/\S.*/,"",1)
    printf "%sLogger.add(Constants.METHOD_NAME,\"%s\");\n", indent, methodName
    lineNr = 0
}
{ print }

$ awk -f tst.awk file
public class DataServiceImpl
   {
     public String getProtocol()
     {
        Logger.add(Constants.METHOD_NAME,"getProtocol");
        return "https";
     }
     public String buildUrl()
     {
       Logger.add(Constants.METHOD_NAME,"buildUrl");
       String url = getProtocol()+"://www.google.com";
       return url;
     }
}

または、すべてのUNIXシステムのすべてのシェルでawkを使用します。

$ cat tst.awk
/(private|protected|public).*\(/ {
    methodName = $0
    sub(/[[:space:]]*\(.*/,"",methodName)
    sub(/.*(private|protected|public).*[[:space:]]/,"",methodName)
    lineNr = NR+2
}
NR == lineNr {
    indent = $0
    sub(/[^[:space:]].*/,"",indent)
    printf "%sLogger.add(Constants.METHOD_NAME,\"%s\");\n", indent, methodName
    lineNr = 0
}
{ print }

$ awk -f tst.awk file
public class DataServiceImpl
   {
     public String getProtocol()
     {
        Logger.add(Constants.METHOD_NAME,"getProtocol");
        return "https";
     }
     public String buildUrl()
     {
       Logger.add(Constants.METHOD_NAME,"buildUrl");
       String url = getProtocol()+"://www.google.com";
       return url;
     }
}

関連情報