Unix Shell中的文件模式匹配(Pattern Matching)
Unix Shell中的文件模式匹配(Pattern Matching)是文件操作和脚本编程中的核心功能,主要用于文件名匹配、路径搜索和字符串处理。以下是其核心用法及注意事项的详细总结:
一、基本通配符用法
- 星号(
*)- 匹配任意长度(包括零长度)的字符串。例如:
f*匹配所有以f开头的文件(如file.txt、folder)。*.txt匹配所有.txt后缀的文件。
- 注意:无法匹配以点(
.)开头的隐藏文件(需显式使用.*)。
- 匹配任意长度(包括零长度)的字符串。例如:
- 问号(
?)- 匹配单个任意字符。例如:
file?.txt匹配file1.txt、fileA.txt,但不匹配file10.txt。
- 匹配单个任意字符。例如:
- 方括号(
[])- 匹配括号内列出的任意一个字符。例如:
[abc]匹配a、b或c。[a-z]匹配任意小写字母。
- 特殊规则:
- 连字符(
-)在方括号内表示范围(如a-d等价于abcd)。 - 表示排除的字符需用
!或^,例如[!a-z]匹配非小写字母。
- 连字符(
- 匹配括号内列出的任意一个字符。例如:
二、高级变量替换模式
Shell支持通过参数替换对变量进行模式匹配和截取,常用语法如下:
${variable%pattern}和${variable%%pattern}
- 从变量值的右侧删除匹配的最短或最长模式。例如:
var=testcase echo ${var%s*e} # 删除最短匹配的 "s*e",结果为 "testca" echo ${var%%s*e} # 删除最长匹配的 "s*e",结果为 "te"
${variable#pattern}和${variable##pattern}
- 从变量值的左侧删除匹配的最短或最长模式。例如:
echo ${var#?e} # 删除最短匹配的 "?e",结果为 "stcase" echo ${var##*e} # 删除最长匹配的 "*e",结果为空(完全删除)
三、在脚本中的应用
case语句中的通配符- 用于分支判断,支持
*、?和[]。例如:case "$filename" in *.txt) echo "Text file" ;; *.[ch]) echo "C source or header" ;; ???.*) echo "Three-character prefix" ;; *) echo "Default" ;; esac - 匹配规则基于Shell的文件名扩展,而非正则表达式。
- 用于分支判断,支持
find命令的文件名匹配- 结合
-name参数使用通配符递归搜索文件:find . -name "*.log" # 查找当前目录及子目录下所有 .log 文件
- 结合
四、注意事项
- 特殊字符处理
- 通配符在文件名中可能导致意外匹配(如
*或?作为文件名的一部分),需用反斜杠转义(如\*)或单引号包裹。
- 通配符在文件名中可能导致意外匹配(如
- 大小写敏感性
- 默认匹配区分大小写,但可通过
shopt -s dotglob(匹配隐藏文件)或shopt -s nullglob(无匹配时返回空)调整行为。
- 默认匹配区分大小写,但可通过
- 与正则表达式的区别
- Shell通配符(如
*、?)与正则表达式语法不同。例如:grep "a.*b"匹配正则表达式,而ls a*b使用通配符。
- Shell通配符(如
五、扩展工具中的模式匹配
grep/egrep- 使用正则表达式匹配文件内容,支持
-i(忽略大小写)、-w(整词匹配)等选项。
- 使用正则表达式匹配文件内容,支持
fnmatch模块(Python)- 提供类似Shell的通配符匹配功能,如
fnmatch.fnmatch("file.txt", "*.txt")。
- 提供类似Shell的通配符匹配功能,如
通过合理组合通配符和模式匹配工具,可以高效处理文件操作和文本处理任务。具体场景中需注意通配符与正则表达式的差异,以及特殊字符的转义规则。

浙公网安备 33010602011771号