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

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

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

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
}

答え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'

関連情報