2012-05-21 124 views
2

我試圖在屬性文件中替換一行文本。 例如:Bash - sed替換文本

food.type=banana 

隨着這行代碼我可以取代香蕉完全與另一輸入的輸入。

FOOD=apple 
sed "s/food.type=.*/food.type=$FOOD/" 

輸出:

food.type=apple 

然而,當我試圖替換文本的前行中有一個/,我不能得到更換工作。 例如:

food.type=/yellow/banana 

任何幫助,非常感謝。謝謝!

+1

您必須用\ /或使用不同的分隔符來跳過斜線。 –

回答

5

的斜線被解讀爲關閉REG-EX匹配/替代模式,

sed "[email protected]=.*@[email protected]" 

一些SEDS需要你逃避非標準分隔符的第一個實例,即

sed "s\@food.type=.*@[email protected]" 

我希望這有助於。

+2

這裏感興趣的一點是,你可以用這種方式使用任何*字符作爲他的正則表達式分隔符。其他常見選項包括'|','''和':',具體取決於要處理的文本。 – dmckee

+0

是的,好點。感謝分享。 – shellter

1

另一種選擇是繼續使用/作爲sed的分隔符,並在替換字符串中轉義任何斜槓。 bash中能做到這一點(雖然這是一個,但神祕的):

sed "s/food.type=.*/food.type=${FOOD//\//\/}/" 

該變量代換是相當神祕,所以讓我打破它由一塊解釋件:

${FOOD啓動食品
的變量替換 //更換的
\/字符/(注意,必須在這方面進行轉義)
/所有出現...
\/替換字符串\/(注意,這裏的逃逸作爲替換字符串的一部分,僅僅是處理)替代


}末但是,這並不完全是完美的,因爲有可能引起麻煩的幾個其他字符如果它們出現在替換字符串中。要真正防彈這一點,你可以做的幾種替代在bash(亂),或農場的工作出來sed

ESCAPEDFOOD="$(printf "%s" "$FOOD" | sed 's/[\/&]/\\&/g')" 
sed "s/food.type=.*/food.type=$ESCFOOD/" 

再次,替代變得有點神祕,所以這裏有一個細目:

s/更換模式
[\/&]任何字符\/的,或&
/與...
\\&替換字符串\(這裏逃脫了),再加上原有的比賽
/g ...全局(即全部替換)

(是的,我知道用sed來準備的諷刺字符串,與sed一起使用。)

請注意,這可能是我錯過了一些麻煩的字符;如果是這樣,他們可以被添加到[]表達式中。