2016-01-23 94 views
4

我在Mac OS X上並使用sed進行就地替換。在OS X上使用sed和shell變量進行路徑替換

基本上我有這樣的:

#!/bin/sh -e 
PREFIX="$1" 

sed -i bak -e 's|OCAMLDIR|"${PREFIX}"|g' ocamloptrev 

PREFIX是一個路徑,所以我使用的|

不幸的是,文件路徑變量是沒有得到我預期的評估,我結束了:

OCAMLC="${PREFIX}"/bin/ocamlopt 

我怎樣才能得到的${PREFIX}評價權到sed命令?

回答

6

試試這個:

#!/bin/sh -e 
PREFIX="$1" 

sed -i bak -e 's|OCAMLDIR|'"${PREFIX}"'|g' ocamloptrev 

你基本上是在做什麼,是「退出」 /獲取單引號字符串外,進入一個雙引號字符串,解釋雙引號裏面的變量,然後再次輸入單引號。

有了這個簡單的例子,我們也可以只使用雙引號,這讓變量來解釋:

#!/bin/sh -e 
PREFIX="$1" 

sed -i bak -e "s|OCAMLDIR|${PREFIX}|g" ocamloptrev 

如果您嘗試使用單引號雙引號(""),他們不也無法解釋。 This part of the Bash manual更詳細地解釋了這一點。在單引號

3.1.2.2單引號

圍字符(「'」)保留了引號內的每個字符的文本值。單引號之間可能不會出現單引號,即使前面加了反斜線。

3.1.2.3雙在雙引號行情

內附字符(「"」)保留了引號中的所有字符的字面意義,與$例外,`\,並且,當歷史擴展已啓用,!。字符$`在雙引號內保留其特殊含義(請參見Shell Expansions)。 ...

+0

如果'$ {PREFIX}'包含空格等等。你應該括在雙引號中的第一個代碼會碰到的問題:'「S | OCAMLDIR |」「$ {PREFIX}」'| g''是安全的。否則,你的答案很好。 –

+0

你是完全正確的,修復。謝謝! – Will

3

的Shell變量不是單引號(有單引號,即使不是反斜槓內沒有元字符),所以你需要使用這樣的事情,用雙引號${PREFIX}確保空間等內擴大在價值正確處理:

sed -i bak -e 's|OCAMLDIR|'"${PREFIX}"'|g' ocamloptrev 

或者你甚至可以使用:

sed -i bak -e "s|OCAMLDIR|${PREFIX}|g" ocamloptrev 

後者是安全的,因爲雙引號裏面的材料不會CON tain shell元字符(美元符號,反斜槓和反引號是主要的危險信號)。如果在字符串的其餘部分中存在可笑的字符,則第一個版本更安全。

就個人而言,我會使用.bak而不僅僅是bak作爲後綴。