Awk 通过bash脚本对包含主函数的类名进行Grepping
我正在编写脚本,grep包含多个类的java文件的类名,如果它包含main函数。 示例:我的文件包含Awk 通过bash脚本对包含主函数的类名进行Grepping,awk,sed,Awk,Sed,我正在编写脚本,grep包含多个类的java文件的类名,如果它包含main函数。 示例:我的文件包含text.txt class Parent { public void p1() { System.out.println("Parent method"); } } public class Child extends Parent { public static void main(String[] args) { C
text.txt
class Parent
{
public void p1()
{
System.out.println("Parent method");
}
}
public class Child extends Parent {
public static void main(String[] args)
{
Child cobj = new Child();
cobj.c1(); //method of Child class
cobj.p1(); //method of Parent class
}
public void c1()
{
System.out.println("Child method");
}
}
输出将是:Child
,因为它包含主函数。在文件中找到主模式之前,我分析了模式和grep两行。
我的剧本:
grep -B 2 "public static void main" "text.txt" > sample.txt
filen=$(grep -oP '(?<=class )[^ ]*' sample.txt)
echo $filen
请帮助我找到正确的方法。在Linux上,我会这样做:
grep -e 'public class\|public static void main\>' text.txt | grep -B1 "public static void main" | grep '\<class\>' | sed "s/^.*class \+//;s/ .*$//"
grep-e'public class\\;public static void main\>'text.txt | grep-B1“public static void main”| grep'\'| sed“s/^.*class\+/;s/*$/”
:grep包含“public class”或“public static void main”的所有行grep-e'public class\| public static void main\>'text.txt
:grep包含“public static void main”的行和前面的一行| grep-B1“public static void main”
:Greps包含单词“class”的行| grep'\'
:除去类名周围的所有内容|sed“s/^.*class\+/;s/*$/”
注意
\
匹配单词边界。因此,\
与单词“class”匹配,但与单词“declassified”不匹配。请您尝试一下下面的内容
awk '/public static void main>/{print val} /public class/{val=$3}' Input_file
您可以使用Perl。以下内容适用于这两种情况。请注意,当公共/静态/类等之间的空格超过2个时,grep和awk可能会给出错误的结果
$ perl -0777 -ne ' /\bpublic\s+class\s+(\S+).+?public\s*static\s*void\s*main/ms and print "$1\n" ' arya2.txt
Child
$ cat arya2.txt
class Parent
{
public void p1()
{
System.out.println("Parent method");
}
}
public class Child extends Parent {
public void c1()
{
System.out.println("Child method");
}
public static void main(String[] args)
{
Child cobj = new Child();
cobj.c1(); //method of Child class
cobj.p1(); //method of Parent class
}
}
不清楚,请务必说明您需要如何使用逻辑输出。@RavinderSingh13,您是在询问我的脚本代码吗?您应该指出,这需要GNU awk用于单词边界。就我个人而言,我只是想摆脱
\>
,这样它就可以移植到所有AWK,因为任何基于regexp的解决方案都是不精确的。您的regexp中的*
没有做任何有用的事情,顺便说一句,把它扔掉吧。
$ perl -0777 -ne ' /\bpublic\s+class\s+(\S+).+?public\s*static\s*void\s*main/ms and print "$1\n" ' arya2.txt
Child
$ cat arya2.txt
class Parent
{
public void p1()
{
System.out.println("Parent method");
}
}
public class Child extends Parent {
public void c1()
{
System.out.println("Child method");
}
public static void main(String[] args)
{
Child cobj = new Child();
cobj.c1(); //method of Child class
cobj.p1(); //method of Parent class
}
}