【问题标题】:Replacing text in a file using sed with an environment variable [duplicate]使用带有环境变量的sed替换文件中的文本[重复]
【发布时间】:2020-07-17 14:44:29
【问题描述】:

我有一些 js 文件,我想将其中的 http://localhost:3010 替换为环境变量 $SERVER

例如$SERVER=http://example.com

一个示例文件是 server=http://localhost:3010更换后应该是这个server=http://example.com

我试过关注 find . -type f -name "*.js" -exec sed -i "s/http:\/\/localhost:3010/$SERVER/g" {} +

find . -type f -name "*.js" -exec sed -i 's/http:\/\/localhost:3010/$SERVER/g' {} +

两者都不行

【问题讨论】:

    标签: regex shell sed


    【解决方案1】:

    你可以试试这个:

    find . -type f -name "*.js" -exec sed -i "s~http://localhost:3010~$SERVER~g" {} +
    

    所以使用双引号以便 shell 可以扩展 $SERVER 并使用备用分隔符 ~ 因为 / 是您的变量的一部分。

    【讨论】:

      【解决方案2】:

      问题是 shell 在sed 看到它之前扩展了$SERVER,并且$SERVER 中有斜线。所以sed 得到了这个替换命令:

      s/http:\/\/localhost:3010/http://example.com/g
      

      ... 其中有多余的未引用的/s,因此是语法错误。

      您可以使用不同的分隔符(无论您在 s 之后放置的内容都是它在表达式的其余部分中查找的内容),只要您可以选择一个您知道不会出现在值中的分隔符$SERVER。那么你根本不需要引用任何斜线:

      sed -i "s^http://localhost:3010^$SERVER^g"
      

      如果您使用某些现代 shell,例如 bashzsh,则可以在扩展 SERVER 时使用特殊的参数替换来引用斜线,这样的优点是无论包含什么字符都可以工作在字符串中:

       sed -i "s/http:\/\/localhost:3010/${SERVER//\//\\\/}/g"
      

      一般结构是 ${varname//old/new} 以扩展为变量 $varname 的值,并将所有¹出现的字符串 old 替换为字符串 new。与sed 的情况不同,没有办法为这种特殊的参数扩展选择替代分隔符,因此我们的旧字符串和新字符串中的斜杠和反斜杠必须用反斜杠引用。这导致了倾斜的牙签效应;有点难看,但很有效。

      ¹ 在变量名后使用单斜杠将导致仅替换第一次出现的 old 字符串。

      【讨论】:

        猜你喜欢
        • 2021-08-01
        • 2011-08-18
        • 2017-12-03
        • 2013-02-20
        • 1970-01-01
        • 2017-12-20
        • 2018-05-29
        • 2016-02-02
        • 2013-11-01
        相关资源
        最近更新 更多