2013-09-29 90 views
1

我正在使用bash腳本替換文件中兩個字符串之間的特定文本。它看起來像這樣:用bash代替部分url

GATEWAYURL = 'myDomain.com' 
CONFIGFILE = 'full/path/to/config.file' 

replacementString1="s/(?<=gatewayIp:).*(?=,)/\"${GATEWAYURL}\"/;" 

perl -pi -e $replacementString1 $CONFIGFILE 

這個偉大的工程,使看起來像這樣的文件中的行:

gatewayIp:"the.old.domain.name.com", 

是這樣的:

gatewayIp:"myDomain.com", 

所有這些都是好的,但對於我的生活,我無法弄清楚如何讓這個工作來取代部分網址。例如,我想:

redirectUri: "http://the.old.domain.name.com/oauth2callback.html", 

是:

redirectUri: "http://myDomain.com/oauth2callback.html", 

我認爲這會工作:

replacementString1="s/(?<=redirectUri: \"http:\/\/).*(?=\/oauth2callback.html)/${GATEWAYURL}/;" 

不過,我得到以下錯誤:

Substitution pattern not terminated at -e line 1. 

我嘗試了其他一些逃避方法/和/在網址,但似乎無法讓它正常工作。

+0

你不告訴你是如何定義'GATEWAYURL'但顯然它包含轉義斜槓。最簡單的解決方法是使用文本中不會出現的分隔符; @EranBen-Natan的答案用'sed'演示了這一點,但是您可以在Perl中使用相同的語法。 – tripleee

回答

0

你的問題是shell沒有做你期望的perl行。

現在,它替換replacementString1,然後將其解析爲傳遞給perl的參數,以便perl的-e僅作爲參數獲得空格字符。

要強制外殼把它當作一個參數,只需添加雙引號:

perl -pi -e "$replacementString1" $CONFIGFILE 
2
sed -i "s#http://[^/]*#http://$GATEWAYURL#" $CONFIGFILE