目录
^ $ * . .* [] [-] [^] \ \< \> () x\{m\)} x\{m,\} x\{m,n\}
一前言
1 名词解释
正则表达式(regular expression, RE)是一种字符模式,用于在查找过程中匹配指定的字符。
在大多数程序里,正则表达式都被置于两个正斜杠之间;例如/l[oO]ve/就是由正斜杠界定的正则表达式,
它将匹配被查找的行中任何位置出现的相同模式。在正则表达式中,元字符是最重要的概念。
2 工具
被 yum sed awk grep调用
3 场景
mysql、oracle、php、python ,Apache,Nginx... 需要正则
4 回顾示例
需求:
匹配数字的脚本:用户输入创建账号的数量
语法:
[[ ^[0-9]+$ ]]
示范:
read -p "输入数字才退出: " numwhile :
doif [[ ! $num =~ ^[0-9]+$ ]];then
echo "error enter!"
read -p "输入数字才退出:" num
else
echo "thank you"
exit 1
fi
done
二 元字符
1 定义
定义:元字符是这样一类字符,它们表达的是不同于字面本身的含义
2 分类
==基本正则表达式元字符==
^ $ * . .* [] [-] [^] \ \< \> () x\{m\)} x\{m,\} x\{m,n\}
^ // 行首定位符:
# grep "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin# grep "^root" /etc/passwd
为什么什么少一行?
root:x:0:0:root:/root:/bin/bash
$ 行尾定位符
love$
. 匹配任意单个字符
# grep abc 1.txt
abc
# grep adc 1.txt
adc
# grep a.c 1.txt
abc
adc
* 匹配前导符0到多次
# cat 1.txt
a
ab
abc
abcd
abcde
abcdef
ggg
hhh
iii
# grep "abc*" 1.txt
ab
abc
abcd
abcde
abcdef
# grep "abcd*" 1.txt
abc
abcd
abcde
abcdef
.* 任意多个字符
# grep ".*" 1.txt
a
ab
abc
abcd
abcde
abcdef
ggg
hhh
iii
为什么*.不好使?
[ ] 匹配指定范围内的一个字符
[lL]ove
# cat 1.txt
love
Love
1ove
iove
# grep [lL]ove 1.txt
love
Love
[ - ]
匹配指定范围内的一个字符,连续的范围
[a-z0-9]ove //[a-Z]=[a-zA-Z]
# cat 1.txt
love
Love
1ove
iove# grep [0-9] 1.txt
1ove# grep [a-z]ove 1.txt
love
iove# grep [a-Z]ove 1.txt
love
Love
iove
[^] 匹配不在指定组内的字符
[^a-z0-9]ove //取反
# cat 1.txt
love
Love
1ove
iove# grep "[^a-z]ove" 1.txt
Love
1ove# grep "[^0-9]ove" 1.txt
love
Love
iove
\ 用来转义元字符 ('' "" \),脱意符
# grep "l." 1.txt
love
l.ve# grep "l\." 1.txt
l.ve
\< 词首定位符
# grep "love" 1.txt
love
iloveyou# grep "\<love" 1.txt
love
^ 和 \< 的区别
# cat 1.txt
i loveyou
loveyou# grep "\<love" 1.txt
i loveyou
loveyou# grep "^love" 1.txt
loveyou
\> 词尾定位符
love\>
()
\(..\)
匹配稍后使用的字符的标签
:3,9 s/\(.*\)/#\1/ 加注释
x\{m\} 字符x重复出现m次
# grep o 1.txt
love
loove
looove
# grep "o\{3\}" 1.txt
looove
x\{m,\} 字符x重复出现m次以上
o\{5,\}
x\{m,n\} 字符x重复出现m到n次
o\{5,10\}
# egrep "o{4,5}" 1.txt
oooo
ooooo
ioooo
ooooi
iooooi
# egrep "o{5,5}" 1.txt
ooooo
==扩展正则表达式元字符==
+ ? a|b ()
+ 匹配1~n个前导字符
# cat 1.txt
lve
love
loove
# egrep lo+ve 1.txt
love
loove
? 匹配0~1个前导字符
lo?ve :?前面的o 有还是没有,都行!
# egrep lo?ve tom.sh
love
lve
a|b 匹配a或b
# egrep "o|v" 1.txt
lve
1ove
loove
looove
loeve
love
Love
iloveyou
l.ve
o
oo
ooo
oooo
ooooo
ioooo
ooooi
iooooi
() 组字符
# egrep "loveable|rs" 1.txt
rs
loveable
lovers
# egrep "love(able|rs)" 1.txt
loveable
lovers
示例:
grep love 1.txt 找love
/^love/ 以love开头
/love$/ 以love结尾
/l.ve/ l开始,一个任意字符,ve结尾
/lo*ve/ l开始,零个或多个o,ve结尾
/[Ll]ove/ 大L 或者小L 开头的 ove
/love[a-z]/ love最后一个小写字母
/love[^a-zA-Z0-9]/ love最后一个(不是字母或者数字),而是符号
# egrep "love[^a-zA-Z0-9]" 1.txt
love,
love?
示例2
/.*/ 所有行
# egrep ".*" 1.txt | wc
/^$/ 空行
/^[A-Z]..$/ 开头一个大写,最后2个任意字符
/^[A-Z][a-z ]*3[0-5]/ 一个大写开头,0到多个小写或空格,3,最后是0-5的一个数字
/[a-z]*\./ 0到多个小写字母,最后一个点
/^ *[A-Z][a-z][a-z]$/ 0到多个空格开头,一个大写,一个小写,再一个小写结尾
/^[A-Za-z]*[^,][A-Za-z]*$/ 0到多个字母开头,非逗号,0到多个英文结尾c
/\<fourth\>/ 找个单词
/\<f.*th\>/ 找单词
/5{2}2{3}\./ 5两次2三次和一个点
/^[ \t]*$/ 0到多个 ,空格或tab的行
/^#/ 井号开头的行
/^[ \t]*#/ 有0到多个,空格或者tab开头的行,的注释行
:1,$ s/\([Oo]ccur\)ence/\1rence/ 多个r
:1,$ s/\(square\) and \(fair\)/\2 and \1/ 换个位置