Переопределение имени класса, если оно содержит основную функцию с помощью bash-скрипта - PullRequest
0 голосов
/ 09 января 2019

Я пишу сценарий, который 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

Но мой подход неверен, если код содержит:

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

Пожалуйста, помогите мне найти правильный подход.

Ответы [ 3 ]

0 голосов
/ 09 января 2019

Не могли бы вы попробовать один раз.

 awk '/public static void main>/{print val} /public class/{val=$3}' Input_file
0 голосов
/ 10 января 2019

Вы можете использовать Perl. Ниже работает для обоих сценариев. Обратите внимание, что grep и awk могут давать неверные результаты, если между public / static / class и т. Д. Более 100 пробелов

$ 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
    }
}
0 голосов
/ 09 января 2019

В 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 все строки, которые содержат "public class" или "public static void main".
  • | grep -B1 "public static void main": grep строка, содержащая "public static void main" и одну строку перед.
  • | grep '\<class\>': перевод строки, содержащей слово «класс».
  • | sed "s/^.*class \+//;s/ .*$//": избавиться от всего, что связано с именем класса.

Примечание \< и \> соответствуют границам слов. Таким образом, \<class\> соответствует слову «класс», но не «рассекречено».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...