여러 줄이 일치하면 텍스트를 삽입하는 방법

여러 줄이 일치하면 텍스트를 삽입하는 방법

다음과 같은 파일이 있습니다.

class SomeClass
    extends anotherClass
    with moreClassA
    with moreClassB {
    //do some crazy stuff
}

다음과 같은 클래스를 하나 더 추가하고 싶습니다.

class SomeClass
    extends anotherClass
    with moreClassA
    with moreClassB 
    with oneMoreClassIwant {
    //do some crazy stuff
}

나는 다음과 같이 대체를 수행하기 위해 sed를 사용해 보았습니다.

sed -E "s/(Class SomeClass[A-Za-z \n]+)\\{/\1with OneMoreClassIWant/" tmp.scala

하지만 여러 줄 일치에서는 작동하지 않습니다.

나는 또한 예를 들었다.이 게시물하지만 내 상황에 적응하지 못했습니다.

답변1

awk를 사용하십시오.

$ cat tst.awk
{ rec = rec $0 RS }
END {
    old = \
        "class SomeClass" RS\
        "    extends anotherClass" RS\
        "    with moreClassA" RS\
        "    with moreClassB {" RS\
        "    //do some crazy stuff" RS\
        "}"

    new = \
        "class SomeClass" RS\
        "    extends anotherClass" RS\
        "    with moreClassA" RS\
        "    with moreClassB" RS\
        "    with oneMoreClassIwant {" RS\
        "    //do some crazy stuff" RS\
        "}"

    if ( s = index(rec,old) ) {
        rec = substr(rec,1,s-1) new substr(rec,s+length(old))
    }

    printf "%s", rec
}

$ awk -f tst.awk file
class SomeClass
    extends anotherClass
    with moreClassA
    with moreClassB
    with oneMoreClassIwant {
    //do some crazy stuff
}

답변2

이것은 작동하는 것 같습니다:

xargs -0 < data | sed -z 's/\(class.*\){/\1\n    with anotherMoreClass {/'

또는

tr '\n' '\0' < data | sed 's/\(class.*\){/\1\n    with anotherMoreClass {/' | tr '\0' '\n'

이 섹션에서 클래스 이름( SomeClass귀하의 경우) 을 \(class.*\)다음과 같이 지정할 수 있습니다.

xargs -0 < data |\
sed -z  's/\(class[[:blank:]]\{1,\}SomeClass.*\){/\1\n    with anotherMoreClass {/'

또는

tr '\n' '\0' < data |\
sed 's/\(class[[:blank:]]\{1,\}SomeClass.*\){/\1\n    with anotherMoreClass {/' |\
tr '\0' '\n'

관련 정보