ファイル内の 1 行を複数行に置き換えたい。たとえば、特定の関数呼び出しを置き換えたい。
foo(1,2)
と
if (a > 1) {
foo(1,2)
} else {
bar(1,2)
}
どうすればbashでそれを行うことができますか?
これは、seds
コマンドが作成された目的です。
shopt -s extglob
ORIG="foo(1,2)"
REP="if (a > 1) {
foo(1,2)
} else {
bar(1,2)
}"
REP="${REP//+(
)/\\n}"
sed "s/$ORIG/$REP/g" inputfile > outputfile
これらの行は、 2 行目で行った形式でREP="${REP//\+( )/\\n}"
を定義する場合にのみ必要であることに注意してください。最初から使用したREP
だけの方が簡単かもしれません。\n
\t
REP
編集:注意!それらを持っている場合は、REP でエスケープする必要があり'
ます。\
OPの質問に応じて編集
新しいファイルを作成せずに元のファイルを変更するには、次の--in-place
ように sed のフラグを使用します。
sed --in-place "s/$ORIG/$REP/g" inputfile
--in-place
国旗には気をつけてください。すべての変更は永続的なものになるため、実行する前にバックアップを作成してください。
これはあなたのために働くかもしれません:
cat <<\! |
> a
> foo(1,2)
> b
> foo(1,2)
> c
> !
> sed '/foo(1,2)/c\
> if (a > 1) {\
> foo(1,2)\
> } else {\
> bar(1,2)\
> }'
a
if (a > 1) {
foo(1,2)
} else {
bar(1,2)
}
b
if (a > 1) {
foo(1,2)
} else {
bar(1,2)
}
c