【问题标题】:Glob pattern to match non-hidden filenames that don't start with a particular string用于匹配不以特定字符串开头的非隐藏文件名的 Glob 模式
【发布时间】:2013-05-09 09:36:30
【问题描述】:

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

注意:问题逐字是

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

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

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

echo <pattern>

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

【问题讨论】:

  • 由于问题的奇怪表述,我怀疑你的老师正在寻找答案[^a][^b]*。这是一个常见的错误,答案中给出了几个正确(但不一定是非基本)的解决方案。
  • @thatotherguy,我认为[^a]?* 是一个更好的答案,反正错误更少
  • @perreal:他知道这一点,但他也假设(像我一样)这个问题的答案实际上并不存在,并提出了一些老师可能的误解知道答案应该是什么,这实际上是错误的。
  • 通过针对测试用例运行 glob 来自动进行评分。一个程序标记您的程序(这是滑铁卢大学,机器人接管开始 xD)。我当前的 glob 是 {a[!b]*,[!a.]?*},我认为它非常聪明,但得到 0/1。我会更新我的帖子。
  • @EricDong:当没有以 a + a 非 b 字符开头的文件时,它仍然会返回 a[!b]*

标签: bash glob


【解决方案1】:

以“a”或“b”开头还是以“ab”开头?后期:

ab*

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

/path/to/ab*

对于您更新的问题:

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

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

【讨论】:

  • 对不起,我问错了问题。我现在大量编辑了我的帖子。
  • @EricDong:再次更新以允许以ba 开头的文件名。
  • @EricDong:是的。那么我能想到的只是{ac,..,az,ba,bb,bc,..,zz}* 之类的东西,但我非常怀疑如果不存在更清洁的替代方案,他们会要求您提供这样一个令人震惊的解决方案。我不知道,对不起。
  • @EricDong:你可以访问 extglob stackoverflow.com/a/217017/89771吗?
  • 没有。我们只能做回声填空。事实上,我们提交了一个包含填充空白部分的文件,然后通过针对测试用例运行它来自动评分。
【解决方案2】:

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

$ echo [!a]?*

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

$ GLOBIGNORE=ab* 
$ echo *

嗯,现在,从技术上讲,这是可行的:

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

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

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

Fwiw,extglob 将是:

$ shopt -s extglob

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

$ @([^a]?|?[^b])*

【讨论】:

  • 不允许使用extglob。必须使用在没有管道等的 echo 之后立即运行的香草球。
  • @EricDong:好吧,有了香草球,我只能给你GLOBIGNORE。我严重怀疑没有那个或shopt 是可能的,除非你使用echo [!a]?* [a][!b]*,并且如果没有以a 开头的文件,你不介意[a][!b]* 在结果中。
  • 嗯,是的,我可以详细说明为什么我只使用nullglob 确实是为了完整性。正在编辑...
  • 在学院里你可以假设任何事情,无论如何
  • 好吧,OP 提到它是一个文件,但提到了test cases,建议使用多个文件列表进行测试...
【解决方案3】:
shopt -s extglob         # turn on extended globbing
echo @([^a]?|?[^b])*

【讨论】:

  • 不允许使用extglob。我们需要让它与你在 echo 之后立即放置的东西一起工作。 ;不允许,也不是大的 shell 脚本。
  • 啊,你说得对,我的extglob 不符合“最少2个字母”的要求。
【解决方案4】:

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

【讨论】:

  • 因为 {a[!b]*,[!a.]?*} 立即展开(大括号展开发生在其他展开之前)到 a[!b]* [!a.]?* 其中实际上更短,我认为没有理由以这种方式使用大括号扩展。如果您想表达两个子模式具有共同后缀的事实,{a[!b],[!a.]?}* 扩展为与原始模式相同的内容,并且也更短,但仍比其扩展长。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多