0

次の内容のbashスクリプトreplace.shがあります。

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

たとえば、次のように実行しようとすると:

replace.sh 何か新しいもの

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

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

ファイルは期待どおりに変更されます。

この $1 構文は、私が書いた他のスクリプトでも機能するようです。引数のエスケープなどに関係する何かが欠けていると思いますか?

ありがとう!

ルード。

4

3 に答える 3

4

変数の置換は単一引用符では行われません。試してください:

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

QUOTING の bash man ページのセクションを参照してください。

于 2012-03-02T10:00:12.987 に答える
1

sed 式の""代わりに使用します。''変数名の解決は妨げられません。あなたが今実際に行っているのは、に置き換える$1こと$2です。次のように、(スクリプトを書かずに) コンソールでテストできます。

$ a=something

$ b=somethingelse

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

$ sed "s/$a/$b/g" testfile
于 2012-03-02T10:00:53.787 に答える
0

これはあなたの質問とは関係ありませんが、ack の使用に関するヘルプです。

-aとは--text互いに競合します。 -aのスーパーセットが得られます--text。どちらかを使用してください。

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

一般に、パイプラインで ack を使用している場合は、代わりに古き良き grep を使用する必要があります。

于 2012-06-05T17:15:12.227 に答える