【问题标题】:sed plus sign doesn't worksed 加号不起作用
【发布时间】:2019-08-29 09:35:36
【问题描述】:

我正在尝试仅在 bash 脚本中将 /./ 或 /././ 或 /./././ 替换为 /。我已经设法为 sed 创建了正则表达式,但它不起作用。

variable="something/./././"
variable=$(echo $variable | sed "s/\/(\.\/)+/\//g")
echo $variable # this should output "something/"

当我尝试仅替换 /./ 子字符串时,它与 sed \/\.\/ 中的正则表达式一起使用。 sed 正则表达式是否需要更多标志才能将子字符串与+ 或* 相乘?

【问题讨论】:

    标签: regex bash sed


    【解决方案1】:

    使用-r 选项使sed 使用扩展正则表达式:

    $ variable="something/./././"
    $ echo $variable | sed -r "s/\/(\.\/)+/\//g"
    something/
    

    【讨论】:

    • 仅供参考 - 在 OSX 和 BSD 上通过“-E”启用扩展正则表达式。感谢您为我指明正确的方向(rtfm 表示“扩展”)!
    【解决方案2】:

    两点让事情变得简单:

    $ variable="something/./././"
    $ sed -r 's#(\./){1,}##' <<< "$variable"
    something/
    
    • 使用{1,} 表示一种或多种模式。你不需要g。
    • 在上述情况下使用不同的分隔符 # 使其可读
    • + 是 ERE,所以您需要启用 -E 或 -r 选项才能使用它

    【讨论】:

      【解决方案3】:

      您也可以使用 bash 的内置参数替换来做到这一点。这不需要sed,它在 OS X 下的 Mac 上不接受-r:

      variable="something/./././"
      a=${variable/\/*/}/                   # Remove slash and everything after it, then re-apply slash afterwards
      echo $a
      something/
      

      请参阅here 了解说明和其他示例。

      【讨论】:

      • 是的,对于mac,我们需要使用-E。
      • @jaypal:或者安装一个合适的 GNU sed ;-)
      • MacOS 11.6 中包含的 sed 将 -r 解释为与 -E 相同,以便与 GNU sed 兼容。这在 2017 年 3 月 27 日的手册页中有描述。
      【解决方案4】:

      任何 sed:

      sed 's|/\(\./\)\{1,\}|/|g'
      

      但在这种情况下甚至不需要+ 或\{1,\},* 会很好,所以

      sed 's|/\(\./\)*|/|g'
      

      应该够了

      【讨论】:

        猜你喜欢
        • 2017-01-02
        • 2014-09-16
        • 1970-01-01
        • 2013-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多