0

一般来说,我对 globbing 非常缺乏经验。如何编写一个匹配以“ab”开头但仍需要长度至少为 2 的文件名的 glob 模式?即“以“ab”以外的 2 个字母字符串开头”这是一道作业题,只允许使用基本的 bash glob,并且必须使用“echo <glob here>”。

注意:问题逐字是

当前目录中的(非隐藏)文件,其名称至少包含两个字符,但不以 ab 开头。

印在纸上。我很确定我没有误解任何东西。要求是

对于以下每个文件搜索条件,提供与条件匹配的通配符模式。您在每种情况下的答案都应该是具有以下格式的文本文件:

echo <pattern>

我目前的尝试是echo {a[!b]*,[!a.]?*},但不知何故,自动评分器实际上在没有人工干预的情况下自动针对测试用例运行您的文件。

4

4 回答 4

4

对于单个字母,可以这样做:

$ echo [!a]?*

但是,对于 2 个字母(假设文件也可以以数字或标点符号或其他各种东西开头),我只能想到这一点,而无需求助shopt

$ GLOBIGNORE=ab* 
$ echo *

好吧,现在,从技术上讲,这将起作用:

$ echo [!a]?* [a][!b]*

[a][!b]*但是,如果没有以 +1 或更多额外字符开头的文件,这将在我们的结果中留下令人讨厌的结果a,这不仅是不可取的,而且甚至被认为是任何应用程序中的错误,因此我不会认为它是有效的答案。要省略它[a][!b]*,我们必须求助于 nullglob(如果extglob不允许,nullglob可能也不允许):

$ shopt -s nullglob
$ echo [!a]?* [a][!b]*

Fwiw,extglob将是:

$ shopt -s extglob

$ 回声 !(ab*) 先前的答案将匹配少于 2 个字符的文件,就像@perreal 所说:

$ @([^a]?|?[^b])*
于 2013-05-15T00:10:12.517 回答
2

以“a”或“b”开头还是以“ab”开头?对于后者:

ab*

不用说,您必须指定解析的路径(相对或绝对):

/path/to/ab*

对于您更新的问题:

{b,c,d,e,f...}{a,c,d,e,f...}*

应该可以,注意这...实际上是无效的,但我不会在这里写整个字母表。:P

于 2013-05-14T23:39:26.320 回答
1
shopt -s extglob         # turn on extended globbing
echo @([^a]?|?[^b])*
于 2013-05-15T00:13:33.823 回答
0

我的原件echo {a[!b]*,[!a.]?*}是正确的,效果很好。老师居然把测试用例设置错了,所以大家都被打错了,刚才被批了。

于 2013-05-15T23:58:45.267 回答