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