> 技术文档 > shell 正则表达式

shell 正则表达式


文章目录

  • 前言
  • 一、基础概念
  • 二、字符类
    • 1. 预定义字符类
    • 2. POSIX字符类
  • 三、Shell工具中的正则应用
    • 1. grep
    • 2. sed
    • 3. awk
  • 四、实用正则模式
    • 1. 常见匹配模式
    • 2. 高级技巧
  • 五、性能优化建议
  • 六、调试技巧

前言

正则表达式是文本处理的强大工具,在Shell脚本中广泛使用。本文将全面介绍Shell中常用的正则表达式语法、工具和实际应用。


一、基础概念

1. 正则表达式类型

基本正则表达式(BRE):grep, sed 默认使用

扩展正则表达式(ERE):grep -E, egrep, awk 使用

Perl兼容正则(PCRE):grep -P (部分系统支持)

2. 常用元字符

shell 正则表达式

二、字符类

1. 预定义字符类

shell 正则表达式

2. POSIX字符类

shell 正则表达式

三、Shell工具中的正则应用

1. grep

# 基本用法grep \'pattern\' file.txt# 常用选项grep -i \'pattern\' file.txt # 忽略大小写grep -v \'pattern\' file.txt # 反向匹配grep -n \'pattern\' file.txt # 显示行号grep -c \'pattern\' file.txt # 统计匹配行数grep -o \'pattern\' file.txt # 只输出匹配部分grep -E \'pattern\' file.txt # 使用扩展正则grep -P \'pattern\' file.txt # 使用PCRE正则(部分系统)# 示例grep \'^[A-Z]\' file.txt # 匹配以大写字母开头的行grep \'[0-9]{3}-[0-9]{4}\' file.txt # 匹配电话号码

2. sed

# 基本用法sed \'s/pattern/replacement/\' file.txt# 常用选项sed -n \'5p\' file.txt # 打印第5行sed -i \'s/old/new/g\' file.txt # 直接修改文件sed \'/pattern/d\' file.txt # 删除匹配行# 示例sed \'s/[0-9]\\+/**NUM**/g\' file.txt # 替换所有数字sed -E \'s/([a-z])([A-Z])/\\1 \\2/g\' file.txt # 在小写和大写字母间加空格

3. awk

# 基本用法awk \'/pattern/{action}\' file.txt# 示例awk \'/^[A-Z]/{print $0}\' file.txt # 打印以大写字母开头的行awk \'$3 ~ /^[0-9]+$/{print $1}\' file.txt # 打印第3列为数字的行的第1列awk \'BEGIN{FS=\":\"; OFS=\"-\"}{print $1,$NF}\' /etc/passwd # 修改输入输出分隔符

四、实用正则模式

1. 常见匹配模式

用途  正则表达式邮箱地址 \\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}\\bURL  `(https?ftp)://[^\\s/$.?#].[^\\s]*`IP地址 \\b(?:\\d{1,3}\\.){3}\\d{1,3}\\b日期(YYYY-MM-DD) `\\d{4}-(0[1-9]1[0-2])-(0[1-9][12][0-9]3[01])`时间(HH:MM:SS) `([01][0-9]2[0-3]):[0-5][0-9]:[0-5][0-9]`HTML标签 `<([a-z]+)([^<]+)(?:>(.)</\\1>\\s+/>)`信用卡号 \\b(?:\\d[ -]*?){13,16}\\b

2. 高级技巧

非贪婪匹配 (PCRE)

echo \"
content
\"
| grep -Po \'
.*?
\'

后向引用

echo \"hello hello\" | sed -E \'s/(hello) \\1/\\1 world/\'

条件匹配

awk \'/start/{flag=1} flag; /end/{flag=0}\' file.txt

多行匹配

grep -Pzo \'(?s)start.*?end\' file.txt

五、性能优化建议

尽量使用具体匹配而非.*

优先使用字符类[abc]而非选择a|b|c

合理使用锚点^和$限定范围

避免过度使用捕获组()

对于复杂匹配,考虑分步处理

六、调试技巧

使用grep --color=auto高亮显示匹配

在线正则测试工具辅助开发

分步构建复杂正则表达式

使用echo $?检查上一条命令的退出状态