在 Bash 中练习正则表达式时,我尝试匹配括号内的整个集合/搜索模式。
相反,我只匹配其中的每个字符。
例如,与
cd
touch a.c a.h a.o a.cho
ls *.[cho]
ls
匹配的:
a.c
a.h
a.o
但它与中的整个集合不匹配a.cho
。
为什么我没有匹配整个系列,怎么可能做到这一点?
在 Bash 中练习正则表达式时,我尝试匹配括号内的整个集合/搜索模式。
相反,我只匹配其中的每个字符。
例如,与
cd
touch a.c a.h a.o a.cho
ls *.[cho]
ls
匹配的:
a.c
a.h
a.o
但它与中的整个集合不匹配a.cho
。
为什么我没有匹配整个系列,怎么可能做到这一点?
您在这里使用的不是正则表达式,而是文件名通配模式。
[...]
只会匹配一个字符(这在文件名通配模式和正则表达式之间恰好是相同的),这就是它不匹配三个字符的原因(cho
意思[cho]
是“一个c
,h
和o
”)。a.
匹配所有以use开头的名称a.*
。要匹配所有以、或开头
a.
然后直接以 、 或 结尾的c
名称,首先使用 设置shell 选项并使用。h
o
cho
extglob
shopt -s extglob
a.@([cho]|cho)
像这样的大括号扩展
a.{c,h,o,cho}
会在命令行上生成文件名,但不能保证这些文件确实存在。您可以使用不是模式而是字符串列表的bash Brace Expansion
在执行 ls 命令之前, shell 将其扩展为
由于大括号扩展发生在文件名扩展之前,我们可以将 glob 模式放在大括号内