Shell第四章《正則表達式》

一、前言

1.1、名詞解釋

正則表達式(regular expression, RE)是一種字元模式,用於在查找過程中匹配指定的字元。
在大多數程式里,正則表達式都被置於兩個正斜杠之間;例如/l[oO]ve/就是由正斜杠界定的正則表達式
它將匹配被查找的行中任何位置出現的相同模式。在正則表達式中,元字元是最重要的概念。

1.2、工具

被vim、sed、awk、grep調用

1.3、場景

mysql、oracle、php、python ,Apache,Nginx…  需要正則

1.4、回顧

示例
    需求
匹配數字的腳本:用戶輸入創建帳號的數量
語法
	[[ ^[0-9]+$ ]]
示範
	read -p "輸入數字才退出:  " num

while :
do

if [[ ! $num =~ ^[0-9]+$ ]];then
        echo "error enter!"
        read -p "輸入數字才退出:" num
else
        echo "thank you"
        exit 1
fi
done

二、元字元 

定義:元字元是這樣一類字元,它們表達的是不同於字面本身的含義

2.1、基本正則表達式元字元

^   行首定位符

[root@localhost ~]# grep "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

[root@localhost ~]# grep "^root" /etc/passwd
為什麼什麼少一行?
root:x:0:0:root:/root:/bin/bash

 行尾定位符

love$

.   匹配任意單個字元

[root@localhost ~]# grep abc 1.txt
abc
[root@localhost ~]# grep adc 1.txt
adc
[root@localhost ~]# grep a.c 1.txt
abc
adc

 匹配前導符0到多次

[root@localhost ~]# cat 1.txt 
a
ab
abc
abcd
abcde
abcdef
ggg
hhh
iii
[root@localhost ~]# grep "abc*" 1.txt 
ab
abc
abcd
abcde
abcdef
[root@localhost ~]# grep "abcd*" 1.txt 
abc
abcd
abcde
abcdef

.*   任意多個字元

[root@localhost ~]# grep ".*" 1.txt 
a
ab
abc
abcd
abcde
abcdef
ggg
hhh
iii

[ ]   匹配指定範圍內的一個字元

[lL]ove
[root@localhost ~]# cat 1.txt 
love
Love
1ove
iove
[root@localhost ~]# grep [lL]ove 1.txt 
love
Love

[ – ]   匹配指定範圍內的一個字元,連續的範圍

[a-z0-9]ove         //////[a-Z]=[a-zA-Z]
	[root@localhost ~]# cat 1.txt 
love
Love
1ove
iove
[root@localhost ~]# grep [0-9] 1.txt 
1ove
[root@localhost ~]# grep [a-z]ove 1.txt 
love
iove
[root@localhost ~]# grep [a-Z]ove 1.txt 
love
Love
iove

[^]   匹配不在指定組內的字元

[^a-z0-9]ove          //////取反
	[root@localhost ~]# cat 1.txt 
love
Love
1ove
iove
[root@localhost ~]# grep "[^a-z]ove" 1.txt 
Love
1ove
[root@localhost ~]# grep "[^0-9]ove" 1.txt 
love
Love
iove

\   用來轉義元字元    (”   “”    \),脫意符

[root@localhost ~]# grep "l." 1.txt 
love
l.ve
[root@localhost ~]# grep "l\." 1.txt 
l.ve

\<   詞首定位符

[root@localhost ~]# grep "love" 1.txt 
love
iloveyou
[root@localhost ~]# grep "\<love" 1.txt 
love

^  和  \<的區別

[root@localhost ~]# cat 1.txt 
i loveyou
loveyou
[root@localhost ~]# grep "\<love" 1.txt 
i loveyou
loveyou
[root@localhost ~]# grep "^love" 1.txt 
loveyou

\>   詞尾定位符

love\>

()   \(..\)   匹配稍後使用的字元的標籤

:3,9 s/\(.*\)/#\1/	加註釋

x\{m\}   字元x重複出現m次 

[root@localhost ~]# grep o 1.txt
love
loove
looove
[root@localhost ~]# grep "o\{3\}" 1.txt
looove

x\{m,\}   字元x重複出現m次以上

 o\{5,\}

x\{m,n\}   字元x重複出現m到n次

o\{5,10\}
	[root@localhost ~]# egrep "o{4,5}" 1.txt 
oooo
ooooo
ioooo
ooooi
iooooi
[root@localhost ~]# egrep "o{5,5}" 1.txt 
ooooo

2.2、擴展正則表達式元字元

+   匹配1~n個前導字元

[root@localhost ~]# cat 1.txt
lve
love
loove
[root@localhost ~]# egrep lo+ve 1.txt
love
loove

?   匹配0~1個前導字元

[root@localhost ~]# egrep lo?ve tom.sh 
love
lve

a|b   匹配a或b

[root@localhost ~]# egrep "o|v" 1.txt 
lve
1ove
loove
looove
loeve
love
Love
iloveyou
l.ve
o
oo
ooo
oooo
ooooo
ioooo
ooooi
iooooi

()   組字元

[root@localhost ~]# egrep "loveable|rs" 1.txt 
rs
loveable
lovers
[root@localhost ~]# egrep "love(able|rs)" 1.txt 
loveable
lovers
Tags: