9

ファイル内の 1 行を複数行に置き換えたい。たとえば、特定の関数呼び出しを置き換えたい。

foo(1,2)

if (a > 1) {  
    foo(1,2)  
} else {  
    bar(1,2)  
}

どうすればbashでそれを行うことができますか?

4

3 に答える 3

8

これは、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\tREP

編集:注意!それらを持っている場合は、REP でエスケープする必要があり'ます。\

OPの質問に応じて編集

新しいファイルを作成せずに元のファイルを変更するには、次の--in-placeように sed のフラグを使用します。

sed --in-place "s/$ORIG/$REP/g" inputfile

--in-place国旗には気をつけてください。すべての変更は永続的なものになるため、実行する前にバックアップを作成してください。

于 2012-05-14T02:26:14.180 に答える
0

これはあなたのために働くかもしれません:

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
于 2012-05-14T13:12:16.183 に答える