【问题标题】:Why does this pattern match `ab`, but not `ba`?为什么这个模式匹配 `ab`,而不匹配 `ba`?
【发布时间】:2012-09-17 18:26:35
【问题描述】:

我在 bash 中摆弄了 extended globbing,但反向匹配器 !(PATTERN) 有一些奇怪之处。考虑下面的例子

$ touch ab ba
$ shopt -s extglob

$ echo *a*
ab ba
$ echo !(a)*a*
ab ba
$ echo *a*!(a)
ab

现在看起来!() 匹配空字符串,但为什么*a*!(a) 不匹配ba

我假设在第二个示例中 ab 是这样匹配的

!(a) ->  ""
*    ->  ""
a    ->  "a"
*    ->  "b"

这反过来会建议在第三种情况下匹配ba

*    ->  "b"
a    ->  "a"
*    ->  ""
!(a) ->  ""

但看起来这不起作用。

即使考虑到贪婪,这对我来说也没有任何意义。我错过了什么?

编辑:
我在GNU bash, Version 4.1.7(2)-release (i386-apple-darwin10.4.0)

【问题讨论】:

标签: bash pattern-matching


【解决方案1】:

这确实很奇怪。我可以重现你的行为。奇怪的是* 后面的a 字符。当我执行你的代码时:

$ echo *a*!(a)
ab

...正如你所描述的。 但是如果我跳过第二个* 它匹配两个文件

$ echo *a!(a)
ab ba

这意味着您的匹配元素应该是正确的。问题是,为什么第二个星号与第一个示例中的空字符串不匹配。正如文档所说,它应该匹配空字符串,但似乎这不能正常工作。

也许我们的 bash 版本与文档不匹配?

$ bash --version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin11)
Copyright (C) 2007 Free Software Foundation, Inc.

【讨论】:

    【解决方案2】:

    这行得通:()添加以消除歧义

    echo @(*a*)!(a)
    echo !(a)@(*a*)
    

    奇怪:*a*!(a)c,匹配 abcbac(这是正常行为)

    【讨论】:

      【解决方案3】:

      这是一个bug in Bash

      切特·拉米写道
      [...] 这将在下一个版本中得到修复。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-09-18
        • 1970-01-01
        • 2011-03-17
        • 2016-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多