Немного неуклюже, но работает.
#!/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
Мы будем использовать 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
Способ :Изолируйте линию интереса. Затем получите имя метода и украсьте его необходимой терминологией ведения журнала. После этого пропустите две строки и напечатайте.
Это намного проще, понятнее, переносимее и т. д. с 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;
}
}