2012-03-27 7 views
1

私はbashスクリプトを作成していますが、 "$ {PRODUCT_NAME}"を "WORD"に置き換えたいとします。 問題は、私はスクリプトを

echo "Replace ${PRODUCT_NAME} with $1 in document.txt" 

for file in $(grep -il ${PRODUCT_NAME} ~/Documents/tmp/document.txt) 
do 
    sed -e "s/${PRODUCT_NAME}/$3/g" $file > /tmp/tempfile.tmp 
    mv /tmp/tempfile.tmp $file 
done 

スクリプトは、引数としてではなく、私が交換したい単語として$ {PRODUCT_NAME}を認識を実行すると$がそう引数の略bashで、「$」です。 "$ {PRODUCT_NAME}"は単語であり引数ではないことを認識させるにはどうすればいいですか?すべての

+1

* Bash変数* ... – l0b0

+0

の値ではなく、 '$ {PRODUCT_NAME} 'の*リテラル*オカレンスを置き換えることに言及したいと思うかもしれませんそれが私が引用符を使用した理由です。 – bruno

答えて

2

まず、あなたのsedスクリプトが実際にPOSIX基本正規表現では、$は、「行の終わり」ではなく「ドル記号」を意味するので、検索パターンとして\${PRODUCT_NAME}ではなく${PRODUCT_NAME}を使用する必要があることに注意してください。それは途方に暮れている。 。 。 bashで

、あなたはバックスラッシュとドル記号を引用することができ、次のいずれか

echo "Replace \${PRODUCT_NAME} with $1 in document.txt" 

for file in $(grep -il ${PRODUCT_NAME} ~/Documents/tmp/document.txt) 
do 
    sed -e "s/\\\${PRODUCT_NAME}/$3/g" $file > /tmp/tempfile.tmp 
    mv /tmp/tempfile.tmp $file 
done 

または他の彼らは$ベースの拡張を許可しないことを除いて、二重引用符のようなもので、単一引用符を(使用、と)\を処理しない:

echo 'Replace ${PRODUCT_NAME} with '"$1 in document.txt" 

for file in $(grep -il ${PRODUCT_NAME} ~/Documents/tmp/document.txt) 
do 
    sed -e 's/\${PRODUCT_NAME}/'"$3/g" $file > /tmp/tempfile.tmp 
    mv /tmp/tempfile.tmp $file 
done 

(ちなみに、それはあなたのsed行が$3を使用しながら、あなたのecho行が$1を使用することを意図的であることがように見えます?同じパラメータを両方使う必要があります)

+0

ありがとう!それは動作し、あなたはgrepコマンドでバックスラッシュを忘れてしまった – bruno

関連する問題