Shell编程之正则表达式应该怎么写
作者:主角1 7
一、正则表达式核心概述
正则表达式(Regular Expression,简称regex/regexp),是一套用于匹配、查找、筛选字符串的字符组合规则,是Shell文本处理的核心工具,无需编写复杂逻辑,即可快速处理文本数据。
核心应用场景:配合Shell常用工具(grep、sed、awk、vim等),实现文本过滤、字符串替换、内容截取、数据校验等操作,广泛用于日志分析、配置文件处理、脚本开发等场景。
分类(Shell环境中):
基础正则表达式(BRE):Shell默认支持,语法简洁,部分元字符需转义才能生效。
扩展正则表达式(ERE):支持更多便捷语法,减少转义操作,需通过工具参数启用(如grep -E、sed -r)。
核心要点:正则的核心是「元字符」,元字符是具有特殊含义的符号,不同元字符组合,可构建不同的匹配规则。
二、基础正则表达式(BRE)核心元字符(必学)
基础正则是Shell默认支持的语法,以下元字符是日常使用频率最高的,需牢记含义与用法。
1. 位置匹配元字符(限定匹配位置)
^:匹配行首,即字符串必须出现在一行的开头。
示例:
grep "^root" /etc/passwd→ 匹配所有以root开头的行。$:匹配行尾,即字符串必须出现在一行的结尾。
示例:
grep "bash$" /etc/passwd→ 匹配所有以bash结尾的行。^$:组合使用,匹配空行(行首到行尾无任何字符,包括空格)。
示例:
grep -v "^$" test.txt→ 过滤掉test.txt中的所有空行(-v表示反向匹配)。
2. 单个字符匹配元字符
.:匹配任意单个字符(除换行符\n外),一个.对应一个字符。
示例:
grep "r..t" test.txt→ 匹配包含r开头、t结尾,中间有2个任意字符的字符串(如root、rout、r12t等)。[]:匹配括号内的任意一个字符,范围可自定义。
常用用法:
[abc]:匹配a、b、c中的任意一个字符;
[a-z]:匹配所有小写英文字母;
[0-9]:匹配所有阿拉伯数字;
[a-zA-Z0-9]:匹配所有字母和数字(即字符数字组合)。
示例:
grep "r[oa]ot" test.txt→ 匹配root或raut。[^]:取反匹配,匹配不在括号内的任意单个字符(^在[]内表示取反)。
示例:
grep "r[^oa]ot" test.txt→ 匹配r开头、t结尾,中间不是o和a的字符串(如r1ot、rbot等)。
3. 次数匹配元字符(限定前面字符的出现次数)
*:匹配其前面的字符「零次或多次」(可以不出现,也可以出现无数次)。
示例:
grep "ro*ot" test.txt→ 匹配root(o出现2次)、rot(o出现1次)、rt(o出现0次)。\+:匹配其前面的字符「至少一次」(必须出现1次及以上,基础正则中需转义)。
示例:
grep "ro\+ot" test.txt→ 匹配root、rot,不匹配rt。\?:匹配其前面的字符「零次或一次」(可选,最多出现1次,基础正则中需转义)。
示例:
grep "ro\?ot" test.txt→ 匹配rot(o出现1次)、rt(o出现0次),不匹配root。\{n\}:匹配其前面的字符「恰好n次」(n为正整数,基础正则中需转义)。
示例:
grep "ro\{2\}ot" test.txt→ 只匹配root(o恰好出现2次)。\{n,\}:匹配其前面的字符「至少n次」(n为正整数,基础正则中需转义)。
示例:
grep "ro\{2,\}ot" test.txt→ 匹配root(o出现2次)、rooot(o出现3次)等。\{n,m\}:匹配其前面的字符「n到m次」(n≤m,基础正则中需转义)。
示例:
grep "ro\{1,2\}ot" test.txt→ 匹配rot(o出现1次)、root(o出现2次)。
4. 分组与引用元字符
\( \):分组,将括号内的多个字符视为一个整体(基础正则中需转义),用于对整体进行次数匹配。
示例:
grep "\(ab\)*" test.txt→ 匹配ab出现零次(空)、一次(ab)、多次(abab、ababab等)。\n:后向引用,引用前面分组匹配到的内容(n为分组序号,\1表示第一个分组,\2表示第二个分组,以此类推)。
示例:
grep "\(ab\)\1" test.txt→ 匹配abab(引用第一个分组ab,重复一次)。
三、扩展正则表达式(ERE)核心补充
扩展正则在基础正则的基础上,简化了语法(无需转义部分元字符),增加了部分便捷规则,需通过工具参数启用(grep -E、sed -r、awk默认支持ERE)。
去除转义:将基础正则中需要转义的元字符(+、?、{}、())取消转义,直接使用即可。
示例:
grep -E "ro+ot" test.txt→ 等价于基础正则的grep "ro\+ot" test.txt(无需转义+)。|:新增「或逻辑」,匹配符号左右任意一侧的表达式。
示例:
grep -E "root|bash" /etc/passwd→ 匹配包含root或bash的行。分组简化:直接使用()分组,无需转义,后向引用仍使用\n。
示例:
grep -E "(ab)+" test.txt→ 匹配ab出现1次及以上(ab、abab等)。
四、Shell中正则的实际应用示例(高频)
正则的价值在于配合Shell工具使用,以下是日常开发中最常用的几个场景,快速上手实操。
1. 用grep过滤文本(基础用法)
过滤包含指定字符的行:
grep "test" test.txt过滤以指定字符开头的行:
grep "^test" test.txt过滤空行:
grep -v "^$" test.txt(-v反向匹配,排除空行)使用扩展正则过滤:
grep -E "test1|test2" test.txt(匹配test1或test2)
2. 用sed替换文本(正则核心应用)
替换单个字符串:
sed "s/test/hello/g" test.txt(将test替换为hello,g表示全局替换)用正则替换:
sed "s/^#.*//g" test.txt(删除所有以#开头的注释行)使用扩展正则:
sed -r "s/(test1|test2)/hello/g" test.txt(替换test1或test2为hello)
3. 用awk提取内容(正则配合字段分割)
提取/etc/passwd中root的shell:
awk -F: '/^root/{print $7}' /etc/passwd(-F:以:为分隔符,匹配root开头的行,打印第7个字段)
五、核心总结
1. 正则表达式是Shell文本处理的「利器」,核心是元字符的组合使用;
2. 基础正则(BRE)是默认支持,扩展正则(ERE)更便捷,需启用对应工具参数;
3. 重点掌握:位置匹配(^、$)、单个字符匹配(.、[])、次数匹配(*、+、?、{})、分组引用(()、\n);
4. 实操是关键,多结合grep、sed、awk练习,才能快速上手,解决实际问题。
到此这篇关于Shell编程之正则表达式应该怎么写的文章就介绍到这了,更多相关Shell编程正则表达式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
