linux shell

关注公众号 jb51net

关闭
首页 > 脚本专栏 > linux shell > Bash Shell通配符与正则表达式

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

五、性能优化技巧

  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通配符与正则表达式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文