我的意思是在 bash 中用一个正则表达式匹配(与ls
、rm
等)名为 、 、 、 的文件test10
。test18
我test30
尝试test38
了test22
许多变体test23
$ ll "test([1,3][0-8]|22|23)"
但我无法让它工作。正确的方法是什么?
答案1
在此上下文中,shell 使用全局模式,不是正则表达式1.在 bash 中,您可以使用 ksh 风格的延长glob (在交互式 bash shell 中默认启用 - 在脚本中,您需要使用 进行设置shopt -s extglob
):
ls test@([13][0-8]|2[23])
或者
ls test@(1[0-8]|2[23]|3[0-8])
在 zsh 中,你可以使用数字范围(尽管它也支持 ksh 样式的扩展 glob):
ls test(<10-18>|<22-23>|<30-38>)
或者,您可以使用括号扩展(在 bash 和 zsh 中) - 但请注意,这实际上并不执行匹配,因此除非所有命名文件都实际存在,否则您会收到错误:
ls test{{1,3}{0..8},22,23}
巧合的是,
([13][0-8]|2[23])
并且(1[0-8]|2[23]|3[0-8])
也是有效的扩展正则表达式,因此您可以在find
表达式中使用它们,例如:find . -maxdepth 1 -regextype posix-extended -regex '.*/test([13][0-8]|2[23])'