
次のファイルがあります。
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'