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

Posted

技术标签:

【中文标题】bash 中的正则表达式量词——简单与扩展匹配 n 次【英文标题】:regex quantifiers in bash --simple vs extended matching n timesbash 中的正则表达式量词——简单与扩展匹配 n 次 【发布时间】:2020-10-16 11:13:33 【问题描述】:

我正在使用 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 次)?

【问题讨论】:

顺便说一句:regex != globbing 使用 shell glob patterns,你必须写 FILE_[0-9][0-9][0-9].txt 【参考方案1】:

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"

【讨论】:

如果它在这种情况下或对将来遇到此问题的任何其他人有用,find -regextype gnu-awk -regex ./FILE_[0-9]3.txt 也可以获得相同的结果。【参考方案2】:

Bash filename expansion 不使用正则表达式。它使用 glob pattern matching,这是明显不同的,而您尝试使用 FILE_[0-9]3.txt 的方法是 brace expansion,然后是文件名扩展。甚至bash 的extended globbing 功能也没有与正则表达式的N 等效的功能,因此如前所述,您必须使用FILE_[0-9][0-9][0-9].txt

【讨论】:

以上是关于bash 中的正则表达式量词——简单与扩展匹配 n 次的主要内容,如果未能解决你的问题,请参考以下文章

python与正则表达式

正则表达式之量词

惰性量词和前瞻

简单理解正则表达式

re 模块

正则表达式以啥结尾