Bash
有两种类型的模式匹配,Glob
和Regex
。一般使用规则似乎是 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)$