2017-10-02 3 views
0

나는 많은 Java 소스 파일을 가지고 있으며 소스의 각 클래스에서 구현 한 인터페이스를 나열하려고합니다.Java 소스 파일에서 구현 인터페이스를 인쇄하는 정규식

클래스가

class SomeClass 
    implements 
     InterfaceC, 
     InterfaceD 
     { 

그래서, 기본적으로, 나는이 할 수있는 경우 여러 줄에 선언 된 클래스가,

class MyClass implements MyInterfaceA, MyInterfaceB { 

그러나 한 줄에 선언 할 때 가장 좋은 경우는 첫 번째 implements 문자열 리터럴과 문자 {의 첫 번째 발생 사이의 모든 것을 캡처 할 수있는 정규 표현식을 구현 인터페이스 이름이 있습니다.

지난 1 시간 정도 동안 나는 grep, pcregrep, sed 및 awk와 같은 여러 도구를 고치고 마침내 작동하는 명령 하나에 도달했습니다. 당신이 볼 수 있듯이

pcregrep -M 'class[\s\S]*implements' 

, 나는 선 내가 implements{ 사이에 출력 모두에 동일한 표현을 수정

class SomeClass 
    implements 

단어 classimplements하고 명령 출력 사이에 출력 모든 것을 시도하고있다 파일에 {이 너무 많거나 {이 특수 문자이기 때문에 필자가 요구하는 것보다 훨씬 더 많은 것을 출력합니다.

그 후에 첫 번째 implements과 첫 번째 { 사이의 텍스트 만 출력하려면 어떻게해야합니까?

샘플 input.java 파일 : GNU 그렙

답변

1

class MyClass implements MyInterfaceA, MyInterfaceB { 
} 
class SomeClass 
    implements 
     InterfaceC, 
     InterfaceD 
     { 
} 

작업 :

my_interfaces=$(grep -Poz '\bimplements[[:space:]]*\K[^{]*(?=\{)' input.java | tr -s '\n' ' ') 
echo "$my_interfaces" 

출력 :

MyInterfaceA, MyInterfaceB InterfaceC, InterfaceD