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

问题描述 投票:0回答:2

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

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

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

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

正如预期的那样。伟大的。但现在我想数数字:

$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} 量词(即“匹配此模式n次)?

regex bash filenames quantifiers
2个回答
3
投票

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"

0
投票

Bash 文件名扩展不使用正则表达式。它使用 glob 模式匹配,这是明显不同的,并且您尝试使用

FILE_[0-9]{3}.txt
进行括号扩展,然后进行文件名扩展。即使
bash
扩展 globbing 功能也没有与正则表达式的
{N}
等效的功能,所以正如已经提到的,你必须使用
FILE_[0-9][0-9][0-9].txt

© www.soinside.com 2019 - 2024. All rights reserved.