【问题标题】:Why wont the plus work properly with this sed command?为什么 plus 不能与这个 sed 命令正常工作?
【发布时间】:2016-08-29 04:42:09
【问题描述】:

我无法让 ([^/]+) sed 正则表达式正常工作。
它不会返回所有非正斜杠字符,而是只返回一个。

命令:

echo '/test/path/file.log' | sed -r 's|^.*([^/]+)/(.*)$|\1.\2|g'

预期:

path.file.log

结果:

h.file.log

也试过这个,但得到了相同的结果:

echo '/test/path/file.log' | sed -r 's|^.*([^/]{1,})/(.*)$|\1.\2|g'

【问题讨论】:

    标签: unix sed


    【解决方案1】:

    问题不在于[^/]+,而在于前面的.*.* 是贪婪的,会消耗最大量的输入。我通常的建议是使用 .*? 使其不贪婪,但 POSIX 正则表达式不支持该语法。

    如果总是有斜线,您可以在正则表达式中添加一个以阻止它消耗太多。

    $ echo '/test/path/file.log' | sed -r 's|^.*/([^/]+)/(.*)$|\1.\2|g'
    path.file.log
    

    【讨论】:

    • 如果前面不一定有斜杠,您可能希望^(.*/)?([^/]+) 将该部分设为可选 - 您需要增加反向引用以考虑额外的分组。
    【解决方案2】:

    操作系统使用不同版本的sed。一些sed 版本默认使用基本的正则表达式语法;如果您需要扩展正则表达式语法(+ 是这些功能之一),那么您需要使用-E 切换选项。

    【讨论】:

      猜你喜欢
      • 2016-10-09
      • 1970-01-01
      • 2021-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-30
      • 2023-02-20
      相关资源
      最近更新 更多