【问题标题】:Regex in sed statementsed 语句中的正则表达式
【发布时间】:2014-08-20 18:18:05
【问题描述】:

我在使用 bash 脚本中的以下表达式时遇到了一些问题:

ipreg=^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$

sed -i 's/\"https:\/\/'$ipreg':9999\",/\"https:\/\/'${newip}':9999\",/g' /usr/share/config.file

Sed 无法使用 var ipreg 找到旧的 IP 地址,但如果我输入确切的地址,它确实会被新 IP 替换。

【问题讨论】:

  • 这是因为您在 sed 命令中使用了单引号,并且变量未展开。只需将sed '...' 更改为sed "..."
  • @fedorqui 我不认为这是导致 OP 问题的唯一原因。用作s/.../.../ 分隔符的斜线也出现在https// 中。他应该改用s:...:...:(或任何非斜线符号)
  • 您能否展示您的/usr/share/config.file 文件的样本?
  • 这里是文件的一些行.. / "10.10.10.10:9999", /* @scratch /configuration/config.js/5 * * ==== default_route *
  • 当我删除 '$ipreg' 并运行 sed -i 's/\"https:\/\/10.10.10.10.:9999\",/\"https:\/\/' ${newip}':9999\",/g' /usr/share/config.file 它正在工作

标签: regex bash shell sed


【解决方案1】:

我认为你把它弄得太复杂了。我认为没有理由如此紧密地匹配 IPv4 地址。

为什么不把它简化一下:

sed -i "s|https://[0-9.]*:9999|https://$newip:9999|" /usr/share/config.file

另外,您可能不希望在您的正则表达式中使用锚点,因为它位于字符串的中间。 ^ 匹配行首,$ 匹配行尾 - 您不希望它们位于匹配模式的中间。

【讨论】:

    【解决方案2】:

    许多sed 方言不支持{1,3} 重复。尝试在花括号前使用反斜杠,和/或查看您的 sed 是否有 -r-E 选项以启用扩展正则表达式 (ERE) 语法。

    在最坏的情况下,只需用手写的方式编写重复内容,或者如果您可以忍受误报的可能性很小,也可以将它们简化为 *

    顺便说一句,你应该在任何包含 shell 元字符的地方使用引号。

    【讨论】:

      【解决方案3】:

      考虑到三人组的评论,这可能可行。

      $ cat config.file 
      .. / "https://10.10.10.10:9999";, /* @scratch /configuration/config.js/5 * * ==== default_route *
      $ cat changeip.sh 
      #!/bin/bash
      ipreg='[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
      newip='127.0.0.1'
      sed -ri 's/"https:\/\/'"${ipreg}"':9999"/"https:\/\/'"${newip}"':9999"/' "$1"
      cat "$1"
      $ ./changeip.sh config.file 
      .. / "https://127.0.0.1:9999";, /* @scratch /configuration/config.js/5 * * ==== default_route *
      

      IP 是否多次出现?只有你才需要全局选项。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-19
        • 1970-01-01
        • 2011-05-01
        • 1970-01-01
        • 2018-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多