3.1 匹配->POSIX通配符标准(POSIX.2):POSIX(Portable Operating System Interface)

3.1 匹配->POSIX通配符标准(POSIX.2):POSIX(Portable Operating System Interface) Python库[[re库详解]]POSIX.2 标准定义的通配符也称为文件名扩展 / 路径名扩展是 Unix/Linux 系统中 Shell如 Bash、sh解析文件名的核心规则区别于正则表达式专门用于匹配文件 / 目录名。下面从核心概念、通配符类型、匹配规则、示例、与正则的区别四个维度详解 POSIX.2 通配符标准核心背景POSIXPortable Operating System Interface是操作系统接口的标准化规范其中 POSIX.2 聚焦 Shell 和实用程序如ls、cp的行为通配符规则是其核心部分之一作用Shell 会先解析通配符将其替换为匹配的文件名列表再执行命令这个过程称为路径名扩展适用场景ls、rm、cp等命令中匹配文件如ls *.txt、rm temp_*POSIX.2 通配符核心类型按优先级 / 功能分类POSIX.2 定义了3 个基础通配符2 个扩展匹配方括号表达式所有规则均基于 ASCII 字符集通配符 / 语法名称匹配规则*星号通配符匹配任意长度的任意字符包括 0 个字符但不匹配以.开头的隐藏文件如.bashrc?问号通配符匹配单个任意字符必须有 1 个不能是 0 个[]方括号表达式匹配括号内的单个字符支持字符范围、取反、字符类[!...]或[^...]方括号取反表达式匹配不在括号内的单个字符!是 POSIX 标准^是 Bash 兼容扩展{}大括号扩展扩展生成多个字符串组合非严格 POSIX.2 核心但 Bash 等实现支持基础通配符*、?*星号匹配任意长度字符0 个及以上但不匹配路径分隔符/需手动指定特殊规则默认不匹配以.开头的隐藏文件需显式写.如.*.txt示例# 匹配当前目录下所有 .txt 文件如 a.txt、b123.txt、空名.txt 但不匹配 .hidden.txt ls *.txt # 匹配所有以 log 开头的文件log、log1、log_2026.txt ls log* # 匹配 /var/log 下所有以 .log 结尾的文件* 不匹配 /需写全路径 ls /var/log/*.log?问号匹配恰好 1 个任意字符不能多也不能少示例# 匹配 2 个字符的 .txt 文件如 a1.txt、b2.txt不匹配 ab.txt、1.txt ls ??.txt # 匹配以 test 开头、后接 1 个字符的文件test1、testa、test_ ls test?方括号表达式[]、[!..]最灵活的匹配方式支持单个字符、字符范围、POSIX 字符类核心规则括号内的字符是 “候选集”仅匹配其中1 个字符范围用-表示如a-z、0-9需保证起始字符 ASCII 码小于结束字符特殊字符如-、]、!需放在特定位置如-放开头 / 结尾]放开头基础字符匹配# 匹配 a.txt、b.txt、c.txt仅匹配 a/b/c 单个字符 ls [abc].txt # 匹配 1.txt、3.txt、5.txt仅匹配 1/3/5 ls [135].txt字符范围匹配# 匹配 a-z 任意小写字母开头的 .txt 文件a.txt、b.txt...z.txt ls [a-z].txt # 匹配 0-9 任意数字 a-f 任意小写字母的 2 字符文件如 1a、5f、9c ls [0-9][a-f] # 匹配大写字母/数字开头的文件A1、B2、9Z ls [A-Z0-9]*取反匹配[!..] 或 [^…]# 匹配不是 a/b/c 开头的 .txt 文件如 d.txt、1.txt不匹配 a.txt ls [!abc].txt # Bash 兼容匹配不是 0-9 开头的文件 ls [^0-9]*POSIX 字符类标准化字符范围POSIX.2 定义了预定义字符类解决不同系统字符集如 ASCII/EBCDIC的兼容性问题格式为[:类名:]必须放在[]内使用字符类含义等价范围ASCII[:alnum:]字母 数字a-zA-Z0-9[:alpha:]字母a-zA-Z[:digit:]数字0-9[:lower:]小写字母a-z[:upper:]大写字母A-Z[:punct:]标点符号!#$%^*()_-等[:space:]空白字符空格 / 制表符、\t等示例# 匹配数字开头的文件等价于 [0-9]*但兼容性更好 ls [[:digit:]]* # 匹配字母数字组成的 3 字符文件如 a1b、9Z8 ls [[:alnum:]][[:alnum:]][[:alnum:]]3. 大括号扩展{}POSIX 扩展虽非 POSIX.2 核心但 Bash、Zsh 等主流 Shell 均实现用于生成多个字符串组合而非 “匹配” 现有文件示例# 生成 file1.txt、file2.txt、file3.txt用于创建/删除多个文件 touch file{1,2,3}.txt # 生成 a.txt、b.txt、c.txt、x.txt、y.txt ls {a,b,c,x,y}.txt # 范围生成1-5 等价于 1,2,3,4,5 ls log{1..5}.log关键规则与注意事项路径分隔符/通配符*、?、[]均不匹配/需手动指定路径层级如*/test.txt匹配子目录下的 test.txt而非根目录隐藏文件. 开头*不匹配以.开头的文件需显式写.如.*.txt匹配.hidden.txt.[a-z]匹配.a、.b等隐藏文件转义与引用若要匹配通配符本身如*、?需用\转义或单引号包裹# 匹配文件名含 * 的文件如 a*.txt ls a\*.txt ls a*.txt空匹配若通配符无匹配文件Shell 会保留原字符如ls non_exist*.txt会直接输出non_exist*.txt并报错POSIX 通配符 vs 正则表达式核心区别新手易混淆关键差异如下维度POSIX 通配符Shell正则表达式Regex用途匹配文件名 / 路径匹配文本内容*匹配任意长度字符匹配前一个字符 0 次?匹配单个任意字符匹配前一个字符 0/1 次[]匹配单个字符 / 范围匹配单个字符 / 范围规则一致锚点无默认匹配任意位置^开头、$结尾优先级Shell 先解析再执行命令命令内部解析如 grep示例对比# POSIX 通配符匹配当前目录下以 txt 结尾的文件 ls *.txt # 正则表达式在文件中匹配以 txt 结尾的行 grep txt$ file.log总结POSIX.2 通配符是 Shell 解析文件名的标准核心为*任意字符、?单个字符、[]字符集[!...]为取反匹配方括号表达式支持字符范围和 POSIX 字符类如[:digit:]兼容性优于手动写0-9关键区别通配符用于匹配文件名不匹配/和默认不匹配隐藏文件与正则表达式的语法和用途完全不同