我正在使用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.txt
和FILE_789.txt
,但不是FILE_2345.txt
(有人能告诉我应该如何使用{n}量词吗?
ls
与glob 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