正则表达式用于匹配固定字符串的连接以及替代表达式

正则表达式用于匹配固定字符串的连接以及替代表达式

我的意思是在 bash 中用一个正则表达式匹配(与lsrm等)名为 、 、 、 的文件test10test18test30尝试test38test22许多变体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}

  1. 巧合的是([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])'
    

相关内容