(BRE/ERE/PCRE 全解析,覆盖 grep/sed/awk 场景)
一、正则表达式分类
二、核心元字符速查表
1. 基础元字符(BRE/ERE通用)
2. 量词(ERE/PCRE支持)
3. 高级符号(ERE/PCRE专用)
三、POSIX 字符类(通用)
使用示例:
grep '[[:digit:]]\{3\}' file.txt # 匹配连续3个数字(BRE模式)
四、工具专用语法
1. grep 家族
示例:
grep -P '^\d{3}-\d{4}$' phone.txt # 匹配 "123-4567" 格式的电话号码
2. sed 流编辑器
3. awk 文本处理器
awk '/^Error/ {print $2}' log.txt # 匹配以 "Error" 开头的行并打印第二列
awk '$3 ~ /[0-9]{2,}/ {print $0}' data.txt # 第三列包含至少2位数字的行
五、常见场景实战
1. 日志分析(grep)
# 查找包含 "error" 或 "warning" 的行(不区分大小写)
grep -Ei 'error|warning' /var/log/syslog
# 提取 IPv4 地址
grep -Po '\b(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]?)\b' access.log
2. 文本替换(sed)
# 将日期格式从 "YYYY-MM-DD" 改为 "DD/MM/YYYY"
sed -E 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\3\/\2\/\1/g' dates.txt
# 删除 HTML 标签
sed 's/<[^>]*>//g' webpage.html
3. 数据提取(awk)
# 提取 CSV 文件的第3列(逗号分隔)
awk -F',' '$3 ~ /^[A-Z]{2}$/ {print $3}' countries.csv # 匹配两位大写字母的国家代码
六、注意事项与陷阱
贪婪匹配:
echo "aabbaabbaa" | grep -o 'a.*a' # 输出整个字符串(贪婪匹配)
echo "aabbaabbaa" | grep -o 'a.*?a' # PCRE非贪婪模式(需 `grep -P`)
转义差异:
BRE 中 +?{} 需转义:\+, \?, \{n\}
ERE/PCRE 中直接使用:+, ?, {n}
性能优化:
避免 .* 开头的表达式,优先用具体字符约束
使用 ^/$ 锚定可加速匹配
附:正则表达式调试工具推荐
RegExr(在线可视化测试)
grep --color=auto(高亮匹配结果)
perl -ne 'print if /pattern/'(Perl 强兼容性测试)