我一般都缺乏经验。如何编写一个匹配文件名而不是的glob模式,例如“ab”,但还需要至少2个的长度?即“以”ab“之外的2字母字符串开头”这是一个家庭作业问题,只允许使用基本的bash globs,并且必须使用“echo< glob here>”。
注意:逐字的问题是
当前目录中的(非隐藏)文件,其名称至少包含两个字符,但不以ab开头。
印在纸上。我很确定我没有误解任何事情。要求是
对于以下每个文件搜索条件,请提供匹配的通配模式 标准。在每种情况下,您的答案应该是一个文本文件,格式如下:
echo <pattern>
我当前的尝试是echo {a[!b]*,[!a.]?*}
,但不知何故,自动评分器实际上无需人为干预即可自动对照测试用例运行文件。
答案 0 :(得分:3)
对于单个字母,这样做:
$ 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
$ echo!(ab *)
之前的答案将匹配少于2个字符的文件,所以就像@perreal所说:
$ @([^a]?|?[^b])*
答案 1 :(得分:2)
以“a”或“b”开头或“ab”开头?对于后者:
ab*
毋庸置疑,您必须指定一个解析的路径(相对或绝对):
/path/to/ab*
更新您的问题:
{b,c,d,e,f...}{a,c,d,e,f...}*
应该有用,请注意...
实际上并不有效,但我不会在这里写整个字母。 :P
答案 2 :(得分:1)
shopt -s extglob # turn on extended globbing
echo @([^a]?|?[^b])*
答案 3 :(得分:0)
我原来的echo {a[!b]*,[!a.]?*}
是正确的,效果很好。老师实际上把测试用例设置错了,所以每个人都被标记错误并且刚刚得到了一个评论。