複数行が一致した場合にテキストを挿入する方法

複数行が一致した場合にテキストを挿入する方法

次のファイルがあります。

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

次のクラスをもう1つ追加したいと思います。

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
}

おすすめ記事