Извлечь имя метода и добавить его для регистратора в качестве первой строки метода

Баш

Немного неуклюже, но работает.

#!/bin/bash
found=false
while IFS= read -r; do
    if $found || [[ $REPLY =~ pattern ]]; then
        found=true
        printf '%s\n' "$REPLY"
    fi
done

Эта версия основана на cat, но ее легче понять.

#!/bin/bash
while IFS= read -r; do
    if [[ $REPLY =~ pattern ]]; then
        printf '%s\n' "$REPLY"
        break
    fi
done
cat
1
25.05.2020, 16:27
2 ответа

Мы будем использовать GNU sed в расширенном режиме регулярных выражений (, чтобы сделать запись регулярных выражений до некоторой степени управляемой ):P. S :Это не синтаксический анализатор, поэтому ожидайте, что некоторые угловые случаи иногда будут срабатывать.

$ 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

Способ :Изолируйте линию интереса. Затем получите имя метода и украсьте его необходимой терминологией ведения журнала. После этого пропустите две строки и напечатайте.

0
18.03.2021, 23:33

Это намного проще, понятнее, переносимее и т. д. с awk, например. с GNU awk для соответствия третьего аргумента (), gensub ()и сокращением \s/\S:

$ 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;
     }
}

или используя любой awk в любой оболочке на каждом компьютере UNIX:

$ 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;
     }
}
0
18.03.2021, 23:33

Теги

Похожие вопросы