在 Bash 中,我可以Foo1.png
通过Foo9.png
使用Foo[0-9].png
.我可以避免Foo5.png
使用Foo[1-46-9].png
.有没有办法指定一系列排除十进制数字?
例如,如果我想排除Foo3.png
and Foo7.png
,我可以使用Foo[0-24-689]
,但我会找到一个Foo[^37].png
更容易阅读的模式。这是 Vim 语法,Bash 不会解释它(不包括3
和 )7
。但我想知道 Bash 在其文件名扩展中是否有字符排除模式。
如果有匹配的解决方案全部除3
或之外的单个字符7
,在某些情况下也会有帮助(例如引发此问题的特定字符,尽管上面的描述过于简化)。
答案1
shellbash
理解类似正则表达式的Foo[^37].png
模式和标准 shell 模式Foo[!37].png
,因此您可以毫无问题地使用它们,除非您有其他需要排除的名称类似Food.png
或等的文件。Fool.png
如果Foo[^37].png
在您的脚本中没有按预期工作,那么这表明您没有使用bash
,而是使用其他 shell,例如(可能在非 GNU 系统上?)您是否在命令行上dash
运行了脚本?sh
如果是这样,请不要这样做,并#!
在脚本中使用正确的 -line 指向正确的 shell 解释器。
假设您想要排除类似的名称Food.png
,以确保后面跟有Foo
数字,然后.png
使用Foo[0-9].png
。要从其中排除Foo3.png
和,请分别测试它们。Foo7.png
for name in Foo[0-9].png; do
case $name in (*[37].png) continue; esac
# process "$name" here
done
或者,使用bash
语法,
for name in Foo[0-9].png; do
[[ $name == *[37].png ]] && continue
# process "$name" here
done
正如 Stéphane Chazelas 在下面的评论中提到的,您可以使用扩展的通配模式来bash
测试3
和以外的数字7
。使用 启用扩展通配模式shopt -s extglob
,然后使用该模式
Foo!(!([0-9])|[37]).png
但对我个人来说,Foo[01245689].png
在决定我相信这个表达式正在做正确的事情(它做)。