2012-03-02 13 views
0

に私はbashスクリプト、次の内容でreplace.sh持って手動で入力するが、いない場合はスクリプトの動作に置き換え:私がしようとすると、それを実行すると例えば、私はスクリプト

ack-grep -a -l -i --print0 --text "$1" | xargs -0 -n 1 sed -i -e 's/$1/$2/g' 

を:

置き換えます.sh something somethingnew

プロンプトはエラーなしで返されますが、ファイルは変更されていません。私は手動で入力した場合 :予想通り

ack-grep -a -l -i --print0 --text "something" | xargs -0 -n 1 sed -i -e 's/something/somethingelse/g' 

ファイルが変更されます。

構文は、私が書いた他のスクリプトではうまくいくようです。私はargsか何かをエスケープすることと何かが行方不明だと思いますか?

ありがとうございます!

ルド。

答えて

4

変数置換は、単一引用符で行われていない、試してみてください。

ack-grep -a -l -i --print0 --text "$1" | xargs -0 -n 1 sed -i -e "s/$1/$2/g" 

QUOTING上のbashのmanページを参照してください。

1

''の代わりに""をsed式に使用してください。可変名解決を妨げません。現在実際に行っていることは$1$2に置き換えています。

$ a=something 

$ b=somethingelse 

$ sed 's/$a/$b/g' testfile 

$ sed "s/$a/$b/g" testfile 
+0

ありがとうございます! :) 2倍の正解、同時に両方で、しかし、彼の最初の答えだったように、他の人に答えを与えた。ありがとう:) – Ludo

0

これはあなたの質問とは関係ありませんが、ackの使用に関するヘルプがあります(スクリプトを書かずにコンソールでテストできます)。

-a--textは互いに競合します。 -a--textのスーパーセットを提供します。どちらか一方を使用してください。

また、greckのスーパーセットであるackの機能を使用していないので、ackの代わりにgrep -Zを使用することもできます。

一般的にパイプラインでackを使用している場合は、代わりにgood ol 'grepを使用しているはずです。

関連する問題