bash中的正则表达式量词-简单与扩展匹配{n}次

问题描述

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

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

范围模式通过以下内容捕获其中的前两个:

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

不是文件名,在“ FILE_”之后带有“ 7”字符。大。但是现在我要数位数:

$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}量词(即“匹配此模式 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 filename expansion不使用正则表达式。它使用glob pattern matching,这是截然不同的,FILE_[0-9]{3}.txt尝试使用的是brace expansion,然后进行文件名扩展。甚至bash的{​​{3}}功能也没有等效于正则表达式的{N},因此如上所述,您必须使用FILE_[0-9][0-9][0-9].txt