sed/awk 명령의 정규식

sed/awk 명령의 정규식

지정한 파일의 내용을 아래와 같이 변경하고 싶습니다. 내가 제공한 클래스 이름을 제외하고 ".class"를 포함하는 모든 줄을 주석 처리하고 싶습니다.

@MyClass1.MyClass2(value = {
    Class1.class,
    Class2.class,
    Class3.class,
    Class4.class
})
public class Foo {}

예를 들어 Class2를 매개변수로 제공하면

sed -i -E 's/some_regex/Class2/g'

명령을 실행하면 결과는 다음과 같아야 합니다.

@MyClass1.MyClass2(value = {
    //Class1.class,
    Class2.class,
    //Class3.class,
    //Class4.class
})
public class Foo {}

이를 위해 어떤 정규식을 사용해야 합니까?

답변1

다음과 같은 파일의 경우:

$ cat file1
@MyClass1.MyClass2(value = {
    Class1.class,
    Class2.class,
    Class3.class,
    Class4.class
})
public class Foo {}
@MyClass11.MyClass2(value = {
    Class1.class,
    Class2.class,
    Class3.class,
    Class4.class
})
public class Foo2 {}

다음과 같은 결과를 얻을 수 있습니다.

$ sed '/@MyClass1.MyClass2(*/,/})/{s|\sClass.*|//&|g; /Class2/{s|//||}}' file1
@MyClass1.MyClass2(value = {
   // Class1.class,
    Class2.class,
   // Class3.class,
   // Class4.class
})
public class Foo {}
@MyClass11.MyClass2(value = {
    Class1.class,
    Class2.class,
    Class3.class,
    Class4.class
})
public class Foo2 {}

설명하다:

'/@MyClass1.MyClass2(*/,/})/ {....}--> 테이블의 작업 범위/from/,/to/{actions}

{s|\sClass.*|//&|g; --> //공백으로 시작하는 모든 줄에 적용됩니다 \s.Class

/Class2/{s|//||} --> //삭제Class2

s/replacethis/withthat/팁: sed에서는 모든 문자를 구문 구분 기호 로 사용할 수 있습니다 .
나는 |탈출을 선택한다//

답변2

awk '/\.class/ && !/Class2/ {print "//", $0}
     !(/\.class/ && !/Class2/) {print $0}' filename

관련 정보