全局和正则表达式匹配

全局和正则表达式匹配

Bash有两种类型的模式匹配,GlobRegex。一般使用规则似乎是 1)glob搜索文件名更简单 2)regex用于搜索文本。

Glob在前面使用元字符,regex在末尾使用元字符pattern

Glob          Regex
?(pattern)    (pattern)?
*(pattern)    (pattern)*     
+(pattern)    (pattern)+    

因此,我很难理解文件如何与通配符匹配(例如*.sh)。通配符与全局模式有什么不同吗?据我所知,搜索模式*.sh不包含与 后的任何字符匹配的元字符*

答案1

通配符是全局模式的一部分。最简单的*?是通配符,也是全局模式。以下是一些简单的 glob:

*.sh              # could match "fred.sh" and also ".sh"
matchme           # would match "matchme"
file[0-9]*.txt    # could match "file12.txt" but also "file12yz.txt"
?ile              # could match "mile" or "file" but not "smile"

您在问题中列出的全局模式是扩展全局模式。因为bash它们在构造中处于活动状态,但仅在启用[[ "$var" == {pattern} ]]时可用于文件名匹配:extglob

shopt -s extglob        # Enable extended globs (bash)
ls -d +([[:digit:]])    # List files/directories whose names are just digits

据我所知,搜索模式*.sh不包含与后面的任何字符匹配的元字符*

该模式使用将匹配零个或多个字符的*.sh通配符。*请记住,glob 不是正则表达式(普通或扩展),但它们是等效的:

Glob            RE              Description

*.sh            ^.*\.sh$        Match anything ending with the three characters ".sh"
?ile            ^.ile$          Match any single character then the text "ile"
+([[:digit:]])  ^[[:digit:]]+$  Match one or more digits (potentially any alphabet, not just 0-9)

Extended Glob   ERE             Description
@(one|two)      ^(one|two)$     Match either "one" or "two"

请注意,匹配“一”或“二”的普通 RE 需要标记出括号和分隔符,即^\(one\|two\)$,因为它们不包括在内。相反,扩展正则表达式确实包含这些运算符,即^(one|two)$

相关内容