文章目录
- 通配符 名称 功能描述 示例 * 星号 匹配任意数量任意字符 ls *.txt ? 问号 匹配单个任意字符 ls file?.txt [] 字符集 匹配括号内任意一个字符 ls [abc]*.txt [!] 否定字符集 匹配不在括号内的任意一个字符 ls [!a]*.txt {} 花括号扩展 生成多个可能组合 touch file{1,2,3}.txt
- 启用扩展通配符: shopt -s extglob 模式 功能描述 示例 ?(pattern) 匹配0次或1次给定模式 ls ?(.txt) *(pattern) 匹配0次或多次给定模式 ls *(backup) +(pattern) 匹配1次或多次给定模式 ls +(log) @(pattern) 匹配给定模式之一 `ls @(jpg !(pattern) 匹配除给定模式外的任何内容 ls !(*.bak)
- 元字符 功能描述 示例 . 匹配任意单个字符 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
- 启用扩展正则表达式: 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
- 字符类 等价于 描述 [:alnum:] [a-zA-Z0-9] 字母和数字 [:alpha:] [a-zA-Z] 字母 [:digit:] [0-9] 数字 [:lower:] [a-z] 小写字母 [:upper:] [A-Z] 大写字母 [:space:] [ trnvf] 空白字符 [:punct:] [!-/:-@[-{-~]` 标点符号
- # 删除所有备份文件 rm *~ # 移动所有图片文件 mv *.@(jpg|png|gif) images/ # 查找所有2023年的日志文件 ls *2023*.log
- # 查找包含”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
- # 匹配有效的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
目录
- 一、通配符 (Wildcards)
- 基础通配符
- 高级通配符 (extglob)
- 二、正则表达式 (Regular Expressions)
- 基础正则表达式 (BRE)
- 扩展正则表达式 (ERE)
- POSIX字符类
- 三、通配符与正则表达式对比
- 四、实用示例
- 1. 文件操作
- 2. 文本处理
- 3. 高级模式匹配
- 五、性能优化技巧
- 六、常见问题解决
- 问题1:通配符不匹配
- 问题2:正则表达式匹配失败
- 问题3:文件名包含特殊字符
- 七、学习资源
通配符是Shell用于文件名扩展的特殊字符,主要用于匹配文件和目录名。
| 通配符 | 名称 | 功能描述 | 示例 |
|---|---|---|---|
* |
星号 | 匹配任意数量任意字符 | ls *.txt |
? |
问号 | 匹配单个任意字符 | ls file?.txt |
[] |
字符集 | 匹配括号内任意一个字符 | ls [abc]*.txt |
[!] |
否定字符集 | 匹配不在括号内的任意一个字符 | ls [!a]*.txt |
{} |
花括号扩展 | 生成多个可能组合 | touch file{1,2,3}.txt |
启用扩展通配符:
shopt -s extglob
| 模式 | 功能描述 | 示例 |
|---|---|---|
?(pattern) |
匹配0次或1次给定模式 | ls ?(.txt) |
*(pattern) |
匹配0次或多次给定模式 | ls *(backup) |
+(pattern) |
匹配1次或多次给定模式 | ls +(log) |
@(pattern) |
匹配给定模式之一 | `ls @(jpg |
!(pattern) |
匹配除给定模式外的任何内容 | ls !(*.bak) |
正则表达式用于文本匹配和处理,比通配符更强大灵活。
| 元字符 | 功能描述 | 示例 |
|---|---|---|
. |
匹配任意单个字符 | 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 |
启用扩展正则表达式:
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 |
| 字符类 | 等价于 | 描述 |
|---|---|---|
[:alnum:] |
[a-zA-Z0-9] |
字母和数字 |
[:alpha:] |
[a-zA-Z] |
字母 |
[:digit:] |
[0-9] |
数字 |
[:lower:] |
[a-z] |
小写字母 |
[:upper:] |
[A-Z] |
大写字母 |
[:space:] |
[ trnvf] |
空白字符 |
[:punct:] |
[!-/:-@[-{-~]` |
标点符号 |
| 特性 | 通配符 | 正则表达式 |
|---|---|---|
| 主要用途 | 文件名匹配 | 文本匹配 |
| 使用场景 | Shell命令参数 | grep/sed/awk等文本处理工具 |
* 的含义 |
任意字符序列 | 前一个字符的0次或多次重复 |
? 的含义 |
任意单个字符 | 前一个字符的0次或1次重复 |
[] 的作用 |
匹配字符集 | 匹配字符集 |
^ 的作用 |
无特殊含义 | 行首定位 |
$ 的作用 |
无特殊含义 | 行尾定位 |
| ` | ` 的作用 | 无特殊含义 |
() 的作用 |
无特殊含义 | 分组 |
# 删除所有备份文件
rm *~
# 移动所有图片文件
mv *.@(jpg|png|gif) images/
# 查找所有2023年的日志文件
ls *2023*.log
# 查找包含"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
# 匹配有效的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
避免过度使用通配符
# 不推荐 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
解决方案:
# 检查是否启用了通配符 echo ~/* # 应该显示家目录内容 # 检查特殊字符转义 ls file*.txt
解决方案:
# 使用grep -P (PCRE) 支持更复杂的正则
grep -P 'd{3}-d{2}-d{4}' ssn.txt
# 使用在线正则测试工具验证
解决方案:
# 使用双引号
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
交互式学习工具:
- 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通配符与正则表达式内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!
您可能感兴趣的文章:
- bash 中用于grep的正则表达式
- shell 正则表达式详细整理
- Shell正则表达式验证IP地址
- shell模糊匹配与正则详解
- Shell正则表达式学习笔记
- Linux Shell脚本的编程之正则表达式