Awk 通过bash脚本对包含主函数的类名进行Grepping

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

我正在编写脚本,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)
    {
        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-e'public class\| public static void main\>'text.txt
    :grep包含“public class”或“public static void main”的所有行
  • | grep-B1“public static void main”
    :grep包含“public static void main”的行和前面的一行
  • | grep'\'
    :Greps包含单词“class”的行
  • |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
    }
}