在 Bash 中匹配字符组合中的每个字符以及组合值本身

在 Bash 中匹配字符组合中的每个字符以及组合值本身

在 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]之一)。cho

匹配所有以a.use开头的名称a.*

要匹配所有以 , 或 结尾的名称,请a.首先使用和use设置shell 选项。chochoextglobshopt -s extgloba.@([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}

相关内容