(十)Shell与正则表达式
十、正则表达式
1. 匹配符
- . 匹配除回车“\n”以外的任意字符
- () 自定义字符串分组(a|b) a或b
- [] 自定义一个匹配的字符 [0-9] [a-z]
- [^] 自定义取反的一个匹配字符
[^0-9]
非数字 - \ 转义字符
2. 限定符
*
某个字符之后加星号表示该字符不出现或出现多次 a*?
某个字符之后加问号表示该字符出现一次或不出现 最多1次+
某个字符之后加加号表示该字符出现一次或多次,但必须出现1次- {n,m} 某个字符之后出现,表示该字符最少n次,最多m次
- {m} 正好出现了m次
案例实操
- 匹配以a开头,以c结尾的字符串
"^a.*c$"
- 匹配以a或b开头,中间任意,c结尾的字符串
"^(a|b).*c$"
- 匹配以a 开头,中间数字, c结尾 的字符串
"^a[0-9]+c$"
- 匹配以a 开头, 中间不是数字, c结尾的字符串
"^a[^0-9]*c$"
- 匹配以ab开头,b出现0次或多次,c结尾的字符串
"^ab*c$"
3. grep
- grep和sed中,\t和\s都是无效的,要表示制表符和空格,只能直接敲入tab和空格键,这个在shell脚本中还好说,在命令行模式下就比较麻烦了,因为tab默认是会智能补全命令的,所以要在按tab之前按下ctrl+v,就可以把tab打出来了
- egrep和grep -E是等效的,egrep相比grep对正则表达式有了一些扩展支持,具体包括一下几点grep不支持(特性grep是可以用的,只不过要在元字符前面加上转义符,比如用到+时,应敲入
\+
)- +:匹配一个或多个先前的字符
- ?:匹配零个或多个先前的字符
- a|b|c :匹配a或b或c
- ():分组符号