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.txt
和FILE_789.txt
,但不是FILE_2345.txt
)有人可以告诉我应该如何使用n量词(即“匹配此模式 n 次)?
【问题讨论】:
顺便说一句:regex != globbing 使用 shell glob patterns,你必须写FILE_[0-9][0-9][0-9].txt
【参考方案1】:
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"
【讨论】:
如果它在这种情况下或对将来遇到此问题的任何其他人有用,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 次的主要内容,如果未能解决你的问题,请参考以下文章