【问题标题】:Replacing part of a url with bash用 bash 替换部分 url
【发布时间】:2013-10-05 01:31:22
【问题描述】:

我正在使用 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",

一切都很好,但对于我的生活,我无法弄清楚如何让它工作以替换部分 url。例如我想要:

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.

我尝试了很多其他方法来转义 url 中的 // 和 / 但似乎无法正常工作。

【问题讨论】:

  • 您没有展示您如何定义 GATEWAYURL 但显然它包含未转义的斜杠。最简单的解决方法是使用文本中没有的分隔符; @EranBen-Natan 的回答用 sed 证明了这一点,但您可以在 Perl 中使用相同的语法。

标签: regex perl bash parsing url


【解决方案1】:
sed -i "s#http://[^/]*#http://$GATEWAYURL#" $CONFIGFILE 

【讨论】:

    【解决方案2】:

    您的问题是 shell 没有按照您对 perl 行的预期执行。

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

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

    perl -pi -e "$replacementString1" $CONFIGFILE
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-10
      相关资源
      最近更新 更多