bash中的regex限定符——简单匹配与扩展匹配{n}次



我正在使用bash shell,并尝试列出名称与regex模式匹配的目录中的文件。其中一些模式有效,而另一些则无效。例如,*通配符很好:

$ls FILE_*
FILE_123.txt    FILE_2345.txt   FILE_789.txt

测距模式通过以下内容捕获前两个:

$ls FILE_[1-3]*.txt
FILE_123.txt    FILE_2345.txt

但是而不是具有";7〃;"后面的字符;FILE_";,正如预期的那样。太棒了但现在我想数数字:

$ls FILE_[0-9]{3}.txt 
ls: FILE_[0-9]{3}.txt: No such file or directory

这不应该给我"FILE_"后面有三个数字的文件名吗?(即FILE_123.txtFILE_789.txt,但不是FILE_2345.txt(有人能告诉我应该如何使用{n}量词吗?

lsglob pattern一起使用,不能使用{3}。你必须使用FILE_[0-9][0-9][0-9].txt。或者,您可以使用以下命令。

ls | grep -E "FILE_[0-9]{3}.txt"

编辑:

或者,也可以使用find命令。

find . -regextype egrep -regex '.*/FILE_[0-9]{3}.txt'

.*/前缀是匹配完整路径所必需的。在Mac OS X上:

find -E . -regex ".*/FILE_[0-9]{3}.txt"

Bash文件名扩展不使用正则表达式。它使用glob模式匹配,这是明显不同的,并且您尝试使用FILE_[0-9]{3}.txt进行大括号扩展,然后进行文件名扩展。即使是bash的扩展globbing功能也没有与正则表达式的{N}等效的功能,所以正如前面提到的,您必须使用FILE_[0-9][0-9][0-9].txt

相关内容

  • 没有找到相关文章

最新更新