Bash Shell通配符与正则表达式实用示例详解

 更新时间:2025年10月24日 09:32:13   作者:韩公子的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

五、性能优化技巧

  1. 避免过度使用通配符

    # 不推荐
    rm *
    
    # 推荐 (更安全)
    rm -i *
    
  2. 使用更精确的匹配

    # 不推荐
    ls *log*
    
    # 推荐
    ls *.log
    
  3. 正则表达式预编译

    # 对于重复使用的正则表达式
    pattern='^[A-Z][a-z]+$'
    grep "$pattern" names.txt
    
  4. 使用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 {} \;

七、学习资源

  1. 交互式学习工具

    • https://regex101.com/ - 在线正则表达式测试和调试
    • https://regexr.com/ - 实时正则表达式学习工具
  2. 参考文档

    • man 7 glob - Linux通配符文档
    • man 7 regex - Linux正则表达式文档
    • man grep - grep命令手册
  3. 进阶书籍

    • 《精通正则表达式》- Jeffrey E.F. Friedl
    • 《Linux命令行与Shell脚本编程大全》- Richard Blum

通过掌握通配符和正则表达式,您可以大幅提高在Linux命令行环境中的工作效率和文本处理能力。建议从基础开始练习,逐步掌握更复杂的模式匹配技巧。

到此这篇关于Bash Shell通配符与正则表达式的文章就介绍到这了,更多相关Bash Shell通配符与正则表达式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Shell命令解释器分类示例详解

    Shell命令解释器分类示例详解

    Shell是负责User与Linux OS之间沟通的桥梁,Shell为用户提供了一个操作界面,User在这个界面输入指令,其实就是通过Shell向Linux Kernel传递过去,这也就是为什么Shell也叫解释器的原因,这篇文章主要给大家介绍了关于Shell命令解释器分类的相关资料,需要的朋友可以参考下
    2023-05-05
  • shell grep 查找进程的小技巧

    shell grep 查找进程的小技巧

    大部分人在写Shell 过滤进程的时候 都会使用 grep 在 ps aux 的输出结果中查找指定的进程,但此时也会把 grep 进程也显示出来
    2013-01-01
  • linux服务器安全加固shell脚本代码

    linux服务器安全加固shell脚本代码

    有时候安装完服务器以后,需要一些安全设置,这段脚本就是为了安全加固所写,需要的朋友可以参考下
    2013-06-06
  • shell 里 awk print 的用法详解

    shell 里 awk print 的用法详解

    这篇文章主要介绍了shell 里 awk print 的用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-09-09
  • Linux 无法使用userdel 删除用户和组的解决方案

    Linux 无法使用userdel 删除用户和组的解决方案

    这篇文章主要介绍了Linux 无法使用userdel 删除用户和组的解决方案的相关资料,需要的朋友可以参考下
    2017-04-04
  • 一天一个shell命令 linux文本操作系列-tac,rev命令详解

    一天一个shell命令 linux文本操作系列-tac,rev命令详解

    这篇文章主要介绍了一天一个shell命令 linux文本操作系列-tac,rev命令详解,需要的朋友可以参考下
    2016-06-06
  • 一句话Shell命令关闭不需要的随机启动服务

    一句话Shell命令关闭不需要的随机启动服务

    这篇文章主要介绍了一句话Shell命令关闭不需要的随机启动服务,使用本文的一句话命令,可以达到优化系统的目的,其中要保留的服务可以自己定义,需要的朋友可以参考下
    2014-12-12
  • shell中实用eval命令和安全问题

    shell中实用eval命令和安全问题

    eval命令非常强大,但也非常容易被滥用,本文主要介绍了shell中实用eval命令和安全问题,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • 分享70个经典的 Shell 脚本面试题与答案

    分享70个经典的 Shell 脚本面试题与答案

    我们为你的面试准备选择了 70 个你可能遇到的 shell 脚本面试问题及解答。了解脚本或至少知道基础知识对系统管理员来说至关重要,它也有助于你在工作环境中自动完成很多任务
    2018-02-02
  • Linux监控cpu以及内存使用情况之top命令(详解)

    Linux监控cpu以及内存使用情况之top命令(详解)

    下面小编就为大家带来一篇Linux监控cpu以及内存使用情况之top命令(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05

最新评论