我的意思是在 bash 中用单个正则表达式匹配(与ls
、rm
等)名称为test10
to test18
、test30
to test38
、test22
to的文件。test23
我尝试了很多变体
$ ll "test([1,3][0-8]|22|23)"
但我无法让它发挥作用。这样做的正确方法是什么?
我的意思是在 bash 中用单个正则表达式匹配(与ls
、rm
等)名称为test10
to test18
、test30
to test38
、test22
to的文件。test23
我尝试了很多变体
$ ll "test([1,3][0-8]|22|23)"
但我无法让它发挥作用。这样做的正确方法是什么?
在这种情况下,shell 使用glob 模式,而不是正则表达式1。在 bash 中,您可以使用 ksh 样式的扩展glob(在交互式 bash shell 中默认启用 - 在脚本中,您需要使用 进行设置
shopt -s extglob
):或者
在 zsh 中,您可以使用数字范围(尽管它也支持 ksh 样式的扩展 glob):
或者,您可以使用大括号扩展(在 bash 和 zsh 中) - 但请注意,这实际上并不执行匹配,因此除非所有命名文件实际上都存在,否则您会收到错误:
巧合的是和
([13][0-8]|2[23])
也是(1[0-8]|2[23]|3[0-8])
有效的扩展正则表达式,因此您可以在find
表达式中使用它们,例如: