bash - 为什么这个模式匹配 `ab` ,而不是 `ba` ?

标签 bash pattern-matching

我摆弄了 extended globbing在 bash 中,但是逆匹配器 !(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,版本 4.1.7(2)-release (i386-apple-darwin10.4.0)

最佳答案

这确实很奇怪。我可以重现你的行为。奇怪的是 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.

关于bash - 为什么这个模式匹配 `ab` ,而不是 `ba` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12596468/

相关文章:

git - 在 Git 中提交时使用 emacsclient -t

linux - Bash - 如何终止脚本并运行下一个脚本

linux - 如何使用 shell 脚本计算每行中的选项卡数?

匹配歌曲的算法

haskell - 模式匹配后多态性丢失

linux - 如何从 linux shell 循环遍历字符串以获得模式?

bash - 如何根据某些 .csv 列移动文件?

java - 如何使用正则表达式从句子中提取多个字符串值?

string - 将结构与字符串匹配的模式

javascript - 使用正则表达式 (regex) 替换 jQuery/JavaScript 中的选定文本