メソッドの最初の行ロガーにJavaメソッド名を追加する必要があります。
次のアプローチを試しています。
- キーワードまたはおよび文字を含む行を
private
取得protected
しpublic
ます(
。これはメソッド定義を識別します。 - 抽出方法名
- メソッド名が見つかったら、2 行の後に新しい行を追加して追加します。
ここで、「メソッド名」は、手順2で抽出した名前です。Logger.add(Constants.METHOD_name, "name of the method")
以下のコードを試しました。
#! /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;
}
}