2012-03-27 107 views
1

我正在構建一個bash腳本,我想用「WORD」替換「$ {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 

腳本識別$ {PRODUCT_NAME}作爲參數,並沒有像我想更換一個字。我如何使其認識到「$ {PRODUCT_NAME}」是一個詞而不是一個參數,因此我可以將其替換?

+1

您可能想要提及的是,您想要替換*文字*出現的$ {PRODUCT_NAME}而不是該* Bash變量的值* ... – l0b0 2012-03-27 13:49:56

+0

這就是我使用引號的原因。 – bruno 2012-03-27 17:14:07

回答

2

首先,請注意您sed腳本實際需要使用\${PRODUCT_NAME},而不是${PRODUCT_NAME}作爲搜索的模式,因爲在一個POSIX基本正則表達式,$意思是「行結束」,而不是「美元符號」。那樣就行了。 。 。

在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 

(順便說一下,是不是故意的,你echo行使用$1而你sed線採用$3這似乎?就像它們應該使用相同的參數一樣)。

+0

謝謝你!它的工作原理,你忘記了grep命令中的反斜槓 – bruno 2012-03-27 13:46:53