用bash替换url的一部分

时间:2013-09-29 00:02:00

标签: regex perl bash parsing url

我正在使用bash脚本替换文件中两个字符串之间的特定文本。它看起来像这样:

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.

我尝试了一些其他方法来逃避//和/中的网址,但似乎无法使其正常工作。

2 个答案:

答案 0 :(得分:2)

sed -i "s#http://[^/]*#http://$GATEWAYURL#" $CONFIGFILE 

答案 1 :(得分:0)

您的问题是shell没有按照您对perl行的期望进行操作。

按原样,它替换replacementString1,然后将其解析为参数以传递给perl,这样perl的-e只能将空格字符作为参数。

要强制shell将其视为单个参数,只需添加双引号:

perl -pi -e "$replacementString1" $CONFIGFILE