Bash Shell通配符与正则表达式实用示例详解
作者:韩公子的Linux大集市
正则表达式是一种可以用于模式匹配和替换的工具,通过正则表达式,Shell可以使用一系列的特殊字符构建匹配模式,然后将匹配模式与待比较字符串或文件进行比较,这篇文章主要介绍了Bash Shell通配符与正则表达式的相关资料,需要的朋友可以参考下
一、通配符 (Wildcards)
通配符是Shell用于文件名扩展的特殊字符,主要用于匹配文件和目录名。
基础通配符
| 通配符 | 名称 | 功能描述 | 示例 |
|---|---|---|---|
* | 星号 | 匹配任意数量任意字符 | ls *.txt |
? | 问号 | 匹配单个任意字符 | ls file?.txt |
[] | 字符集 | 匹配括号内任意一个字符 | ls [abc]*.txt |
[!] | 否定字符集 | 匹配不在括号内的任意一个字符 | ls [!a]*.txt |
{} | 花括号扩展 | 生成多个可能组合 | touch file{1,2,3}.txt |
高级通配符 (extglob)
启用扩展通配符:
shopt -s extglob
| 模式 | 功能描述 | 示例 |
|---|---|---|
?(pattern) | 匹配0次或1次给定模式 | ls ?(.txt) |
*(pattern) | 匹配0次或多次给定模式 | ls *(backup) |
+(pattern) | 匹配1次或多次给定模式 | ls +(log) |
@(pattern) | 匹配给定模式之一 | `ls @(jpg |
!(pattern) | 匹配除给定模式外的任何内容 | ls !(*.bak) |
二、正则表达式 (Regular Expressions)
正则表达式用于文本匹配和处理,比通配符更强大灵活。
基础正则表达式 (BRE)
| 元字符 | 功能描述 | 示例 |
|---|---|---|
. | 匹配任意单个字符 | grep 'f.le' file.txt |
* | 匹配前一个字符0次或多次 | grep 'go*d' file.txt |
^ | 匹配行首 | grep '^start' file.txt |
$ | 匹配行尾 | grep 'end$' file.txt |
[] | 匹配字符集中的任意一个字符 | grep '[aeiou]' file.txt |
[^] | 匹配不在字符集中的任意字符 | grep '[^0-9]' file.txt |
\ | 转义特殊字符 | grep '\.' file.txt |
扩展正则表达式 (ERE)
启用扩展正则表达式:
grep -E 或 egrep
| 元字符 | 功能描述 | 示例 |
|---|---|---|
+ | 匹配前一个字符1次或多次 | grep -E 'go+d' file.txt |
? | 匹配前一个字符0次或1次 | grep -E 'colou?r' file.txt |
| ` | ` | 或操作,匹配多个模式之一 |
() | 分组 | grep -E '(abc)+' file.txt |
{} | 指定匹配次数 | grep -E 'a{3}' file.txt |
POSIX字符类
| 字符类 | 等价于 | 描述 |
|---|---|---|
[:alnum:] | [a-zA-Z0-9] | 字母和数字 |
[:alpha:] | [a-zA-Z] | 字母 |
[:digit:] | [0-9] | 数字 |
[:lower:] | [a-z] | 小写字母 |
[:upper:] | [A-Z] | 大写字母 |
[:space:] | [ \t\r\n\v\f] | 空白字符 |
[:punct:] | [!-/:-@[-{-~]` | 标点符号 |
三、通配符与正则表达式对比
| 特性 | 通配符 | 正则表达式 |
|---|---|---|
| 主要用途 | 文件名匹配 | 文本匹配 |
| 使用场景 | Shell命令参数 | grep/sed/awk等文本处理工具 |
* 的含义 | 任意字符序列 | 前一个字符的0次或多次重复 |
? 的含义 | 任意单个字符 | 前一个字符的0次或1次重复 |
[] 的作用 | 匹配字符集 | 匹配字符集 |
^ 的作用 | 无特殊含义 | 行首定位 |
$ 的作用 | 无特殊含义 | 行尾定位 |
| ` | ` 的作用 | 无特殊含义 |
() 的作用 | 无特殊含义 | 分组 |
四、实用示例
1. 文件操作
# 删除所有备份文件 rm *~ # 移动所有图片文件 mv *.@(jpg|png|gif) images/ # 查找所有2023年的日志文件 ls *2023*.log
2. 文本处理
# 查找包含"error"或"warning"的行
grep -E 'error|warning' log.txt
# 提取所有邮箱地址
grep -E '\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b' file.txt
# 替换日期格式 (YYYY-MM-DD → DD/MM/YYYY)
sed -E 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\3\/\2\/\1/' dates.txt
3. 高级模式匹配
# 匹配有效的IP地址
grep -E '^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$' ips.txt
# 匹配有效的URL
grep -E '^(https?|ftp)://[^[:space:]]+' urls.txt
# 匹配信用卡号 (16位数字,4位一组)
grep -E '^([0-9]{4}-){3}[0-9]{4}$' cards.txt
五、性能优化技巧
避免过度使用通配符
# 不推荐 rm * # 推荐 (更安全) rm -i *
使用更精确的匹配
# 不推荐 ls *log* # 推荐 ls *.log
正则表达式预编译
# 对于重复使用的正则表达式 pattern='^[A-Z][a-z]+$' grep "$pattern" names.txt
使用LC_ALL=C提高性能
# 对于ASCII文本处理 LC_ALL=C grep 'pattern' largefile.txt
六、常见问题解决
问题1:通配符不匹配
解决方案:
# 检查是否启用了通配符 echo ~/* # 应该显示家目录内容 # 检查特殊字符转义 ls file\*.txt
问题2:正则表达式匹配失败
解决方案:
# 使用grep -P (PCRE) 支持更复杂的正则
grep -P '\d{3}-\d{2}-\d{4}' ssn.txt
# 使用在线正则测试工具验证
问题3:文件名包含特殊字符
解决方案:
# 使用双引号
rm "file with spaces.txt"
# 使用find命令
find . -name "*.txt" -exec rm {} \;
七、学习资源
交互式学习工具:
- https://regex101.com/ - 在线正则表达式测试和调试
- https://regexr.com/ - 实时正则表达式学习工具
参考文档:
man 7 glob- Linux通配符文档man 7 regex- Linux正则表达式文档man grep- grep命令手册
进阶书籍:
- 《精通正则表达式》- Jeffrey E.F. Friedl
- 《Linux命令行与Shell脚本编程大全》- Richard Blum
通过掌握通配符和正则表达式,您可以大幅提高在Linux命令行环境中的工作效率和文本处理能力。建议从基础开始练习,逐步掌握更复杂的模式匹配技巧。
到此这篇关于Bash Shell通配符与正则表达式的文章就介绍到这了,更多相关Bash Shell通配符与正则表达式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
