Bash字符类通配符高效用法咨询:匹配多/指定数量小写字母开头文件
关于POSIX字符类与shell通配符的匹配问题
好问题!咱们一步步拆解你的疑问,结合shell通配符的规则来解答:
1. 能不能把[:upper:]这类字符类当作通配符使用?
首先要明确:[:lower:]、[:upper:]这类是POSIX预定义字符类,它们本身不能直接当通配符用——单独写[:lower:]的话,shell会把它当成普通的字符序列(匹配':', 'l', 'o', 'w', 'e', 'r'这些单个字符),完全达不到你想要的“匹配任意小写字母”的效果。
正确的用法是把它们放在方括号[]内部,比如[[:lower:]],这样才代表“匹配任意一个小写字母”的通配符规则。这是因为shell里的[]用来定义字符集合,而POSIX字符类是这个集合的预定义快捷方式。
2. 列出至少以两个小写字母开头的文件,有没有更高效的写法?
你原来的写法ls [[:lower:]][[:lower:]]*是完全可行的,而且已经很直观。如果想要更简洁的表达,取决于你用的shell:
- 如果你用的是bash,需要先开启扩展通配符(extglob):
之后可以用shopt -s extglobls [[:lower:]]{2,}*,这里的{2,}表示“匹配前面的模式至少2次”,[[:lower:]]{2,}就代表2个及以上的小写字母,后面的*匹配剩余任意字符。 - 如果是zsh(默认支持扩展通配符),直接用
ls [[:lower:]]{2,}*即可。
不过要说明:[[:lower:]][[:lower:]]*本身已经足够高效,shell通配符的解析成本极低,两种写法在性能上几乎没有差别,选择哪种主要看可读性。
3. 如何匹配仅以两个小写字母开头的文件?
这里的“仅以两个小写字母开头”指的是:文件名要么刚好是两个小写字母,要么前两个是小写字母,第三个字符(如果存在的话)不是小写字母。
纯shell通配符实现(需扩展通配符)
先确保bash开启extglob(或者用zsh),然后可以用更易读的拆分写法:
# 匹配刚好两个小写字母的文件 ls [[:lower:]][[:lower:]] # 匹配前两个是小写、第三个不是小写的文件 ls [[:lower:]][[:lower:]][^[:lower:]]*
合并起来执行就是:
ls [[:lower:]][[:lower:]] [[:lower:]][[:lower:]][^[:lower:]]*
用grep辅助实现(无需依赖扩展通配符)
如果不想折腾shell的扩展选项,也可以用管道结合grep过滤:
ls [[:lower:]][[:lower:]]* | grep -v '^[[:lower:]]\{3\}'
解释:先列出所有前两个是小写字母的文件,再用grep -v排除掉前三个都是小写字母的文件,剩下的就是“仅以两个小写字母开头”的文件。
内容的提问来源于stack exchange,提问作者eeze
相关产品推荐
相关产品推荐

