目錄
正則表達(dá)式
一,什么是正則表達(dá)式
二,為什么使用正則表達(dá)式
三,如何使用正則表達(dá)式
示例:
四,基本正則表達(dá)式
基本正則表達(dá)式示例:
正則表達(dá)式字符集示例:
五,擴(kuò)展正則表達(dá)式
擴(kuò)展正則表達(dá)式示例:
擴(kuò)展:
正則表達(dá)式
一,什么是正則表達(dá)式
? ? ? ?正則表達(dá)式是通過(guò)一些特殊字符的排列,用以查找、替換、刪除一行或多行文字字符串,簡(jiǎn)單的說(shuō),正則表達(dá)式就是用在字符串的處理上面的一項(xiàng)表示式。由于正則表達(dá)式語(yǔ)法簡(jiǎn)練,功能強(qiáng)大,得到了許多程序設(shè)計(jì)語(yǔ)言的支持,包括Java、C++、Perl以及Shell等。
二,為什么使用正則表達(dá)式
? ? ? ? 在進(jìn)行程序設(shè)計(jì)的過(guò)程中,用戶(hù)會(huì)不可避免地遇到處理某些文本的情況。有的時(shí)候,用戶(hù)還需要查找符某些比較復(fù)雜規(guī)則的字符串。對(duì)于這些情況,如果單純依靠程序設(shè)計(jì)語(yǔ)言本身,則往往會(huì)使得用戶(hù)通過(guò)復(fù)雜的代碼來(lái)實(shí)現(xiàn)。但是,如果使用正則表達(dá)式,則會(huì)以非常簡(jiǎn)短的代碼來(lái)完成。
三,如何使用正則表達(dá)式
? ? ? ?當(dāng)一個(gè)正則表達(dá)式完成之后,并能夠保證這個(gè)表達(dá)式一定是準(zhǔn)確的,需要不斷地測(cè)試才可以確定其正確 與否。在不同的環(huán)境下,用戶(hù)需要不同的工具來(lái)幫助他完成測(cè)試的過(guò)程。如果是在Shell命令行中,用戶(hù) 可以使用grep命令來(lái)測(cè)試。
?grep家族有三大成員分別為:
?grep:支持使用基本正則表達(dá)式。
?egrep:支持使用擴(kuò)展正則表達(dá)式。
fgrep:不支持使用正則表達(dá)式,即所有的正則表達(dá)式中的元字符都將作為一般字符,僅僅擁有其字面 意義,不再擁有特殊意義。
???? grep命令的名稱(chēng)來(lái)自于全局搜索正則表達(dá)式并打印文本行(Global Search Regular Expression and Print out the line)的縮寫(xiě)。它是一個(gè)非常古老的UNIX命令,也是一種強(qiáng)大的文本搜索工具。grep命令 使用正則表達(dá)式來(lái)搜索文本,并且把匹配的文本行打印出來(lái)。
???? grep命令根據(jù)用戶(hù)指定的”pattern(過(guò)濾條件)“對(duì)目標(biāo)文本逐行進(jìn)行匹配檢查;打印出符合條件的 行,即文本搜索工具。注:PATTERN即過(guò)濾條件指由文本字符及正則表達(dá)式元字符所編寫(xiě)的字符串。
?grep命令的基本語(yǔ)法如下:grep [options] pattern [file…]
??? ?在上面的語(yǔ)法中,options表示選項(xiàng),選項(xiàng)列表如下表。pattern表示要匹配的模式,file表示一系列的文 件名。grep命令會(huì)從一個(gè)或者多個(gè)文件中搜索滿(mǎn)足指定模式的文本行,并且打印出來(lái)。模式后面的所有的字符串參數(shù)都被看作是文件名。
示例:
1,? -n :??? 顯示行號(hào)
[root@wangjingjing ~]# ls -l | grep -n num
21:-rw-r--r--. 1 root root? 222 Feb? 1 17:53 num_script.sh
2,? -o :??? 只顯示匹配的內(nèi)容
[root@wangjingjing ~]# ls -l | grep -o num
num
3,? -q :?? 靜默模式,沒(méi)有任何輸出,得用$?來(lái)判斷執(zhí)行成功沒(méi)有,即有沒(méi)有過(guò)濾到想要的內(nèi)容
[root@wangjingjing ~]# ls -l | grep -q num
[root@wangjingjing ~]# echo $?
0
4,? -A :?? 如果匹配成功,則將匹配行及其后n行一起打印出來(lái)
[root@wangjingjing ~]# ls -l | grep num -A 2
-rw-r--r--. 1 root root? 222 Feb? 1 17:53 num_script.sh
drwxr-xr-x. 2 root root??? 6 Dec 31 19:16 Pictures
drwxr-xr-x. 2 root root??? 6 Dec 31 19:16 Public
5,? ?-B :??? 如果匹配成功,則將匹配行及其前n行一起打印出來(lái)
[root@wangjingjing ~]# ls -l | grep num -B 2
-rw-r--r--. 1 root root ? ?0 Jan 30 11:37 newfile
-rw-r--r--. 1 root root ?171 Jan 30 21:55 newfile.sh
-rw-r--r--. 1 root root ?222 Feb ?1 17:53 num_script.sh
6,? ?-C :??? 如果匹配成功,則將匹配行及其前后n行一起打印出來(lái)
[root@wangjingjing ~]# ls -l | grep num -C 2
-rw-r--r--. 1 root root??? 0 Jan 30 11:37 newfile
-rw-r--r--. 1 root root? 171 Jan 30 21:55 newfile.sh
-rw-r--r--. 1 root root? 222 Feb? 1 17:53 num_script.sh
drwxr-xr-x. 2 root root??? 6 Dec 31 19:16 Pictures
drwxr-xr-x. 2 root root??? 6 Dec 31 19:16 Public
7,? ?-c :如果匹配成功,則將匹配到的行數(shù)打印出來(lái) (統(tǒng)計(jì)行數(shù))
[root@wangjingjing ~]# ls -l | grep -c num
1
--color:???? 高亮顏色顯示匹配到的字符串
--color=never沒(méi)有顏色
--color=always
--color=auto自動(dòng)的顏色
-E:? 支持?jǐn)U展中的表達(dá)式
-e:支持基本的正則表達(dá)式
-P: 對(duì)Perl的正則表達(dá)式的支持
8,? ?-o:只輸出匹配到的內(nèi)容
[root@wangjingjing ~]# ls -l | grep? function
-rw-r--r--. 1 root root? 682 Feb? 3 12:07 function_script.sh
[root@wangjingjing ~]# ls -l | grep -o? function
function
9,? ?-v :取反,不匹配
[root@wangjingjing ~]# ls -l | grep -v? function
total 72
-rw-r--r--. 1 root root? 331 Feb? 1 20:22 99table_script.sh
-rw-------. 1 root root 1272 Dec 31 19:14 anaconda-ks.cfg
-rw-r--r--. 1 root root? 215 Jan 31 15:27 arg_script.sh
-rw-r--r--. 1 root root? 332 Jan 31 15:28 args_script.sh
drwxr-xr-x. 2 root root?? 36 Jan? 1 11:00 at230101
drwxr-xr-x. 2 root root? 116 Jan? 8 18:15 ca_learning
10,? ?-w:匹配單詞
[root@wangjingjing 0202]# grep -w hello file.txt
hello
hello world文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-795804.html
四,基本正則表達(dá)式
? ? ? ? 基本正則表達(dá)式(Basic Regular Expression,BRE),又稱(chēng)為標(biāo)準(zhǔn)正則表達(dá)式,是最早制訂的正則表達(dá) 式規(guī)范,僅支持最基本的元字符集?;菊齽t表達(dá)式是POSIX規(guī)范制訂的兩種正則表達(dá)式語(yǔ)法標(biāo)準(zhǔn)之 一,另外一種語(yǔ)法標(biāo)準(zhǔn)稱(chēng)為擴(kuò)展正則表達(dá)式。
基本正則表達(dá)式示例:
1,? ?^ 在每行的開(kāi)始進(jìn)行匹配
匹配以123為開(kāi)頭的
[root@wangjingjing ~]# echo "123 456 789" | grep ^123
123 456 789
[root@wangjingjing ~]# echo "123 456 789" | grep ^456
[root@wangjingjing ~]#
2,? ?$ 在每行的末尾進(jìn)行匹配
匹配以789結(jié)尾的
[root@wangjingjing ~]# echo "123 456 789" | grep 789$
123 456 789
[root@wangjingjing ~]# echo "123 456 789" | grep 456$
[root@wangjingjing ~]#
?
3,? ? ?. 對(duì)任何單個(gè)字符進(jìn)行匹配
匹配ab后面連著任意一個(gè)字符
[root@wangjingjing 0202]# echo "abcdabef" | grep ab.
abcdabef
匹配ab后面連著任意2個(gè)字符
[root@wangjingjing ~]# echo "abcdabcdabcd" | grep a..
abcdabcdabcd
4,? ? ?*(量詞) 對(duì)前一項(xiàng)進(jìn)行0次或多次重復(fù)匹配
盡可能多的去匹配(成功的前提下)
多次a
[root@wangjingjing ~]# echo "aaabbbccc" | grep "a*"
Aaabbbccc
0次a
[root@wangjingjing ~]# echo "bbbccc" | grep "a*"
bbbccc
5,? ? ? ?[str] 對(duì)str中的任何單個(gè)字符進(jìn)行匹配
6,? ? ? ? [a-b] 對(duì)a到b之間的任何字符進(jìn)行匹配
[root@wangjingjing ~]# echo "a" | grep [a-z]
a
[root@wangjingjing ~]# echo "7" | grep [0-9]
7
[root@wangjingjing ~]# echo "m" | grep [a-z]
m
7,? ???[^str] 對(duì)任何不在str中的單個(gè)字符進(jìn)行匹配
匹配,abc的補(bǔ)集
[root@wangjingjing 0202]# echo "a" | grep [^abc]
[root@wangjingjing 0202]# echo "m" | grep [^abc]
m
8,? ? ?\ 忽略后面一個(gè)字符的特殊含義
取消.的特殊意義
[root@wangjingjing ~]# echo "3a14" | grep "^3.14"
3a14
[root@wangjingjing ~]# echo "3a14" | grep "^3\.14"
[root@wangjingjing ~]#
?注意:grep要將{}轉(zhuǎn)義,\{\},egrep不需要轉(zhuǎn)義
9,? ? a{n}: a重復(fù)指定的次數(shù)
[root@wangjingjing 0202]# echo "aaaaaaaa" | grep 'a\{5\}'
aaaaaaaa
[root@wangjingjing 0202]# echo "aaaaaaaa" | egrep 'a{5}'
aaaaaaaa
10,? ?a{n,m}: 重復(fù)n-m次(貪婪的)
對(duì)a第一次匹配(重復(fù))5次,第二次匹配三次
[root@wangjingjing 0202]# echo "aaaaaaaa" | grep 'a\{2,5\}'
aaaaaaaa
11,? ? a{n,}: 最少重復(fù)n次,最多沒(méi)有限制
貪婪的,重復(fù)最多次
[root@wangjingjing 0202]# echo "aaaaa" | grep 'a\{2,\}'
aaaaa
12,? ? a{,m}:最多重復(fù)m次,最少?zèng)]有限制
[root@wangjingjing 0202]# echo "aaaaa" | grep 'a\{,2\}'
aaaaa
13,? ? \(\),定義子表達(dá)式的開(kāi)始和結(jié)束位置。
匹配abcd
[root@wangjingjing 0202]# echo "abcdefbcdcdd" | grep 'a\(b\(c\(d\)\)\)'
abcdefbcdcdd
匹配abcdef,組1
[root@wangjingjing 0202]# echo "abcdefbcdcdd" | grep 'a\(b\(c\(d\)\)\)ef\1'
abcdefbcdcdd
匹配abcdefbcd(組1)cd(組2)
[root@wangjingjing 0202]# echo "abcdefbcdcdd" | grep 'a\(b\(c\(d\)\)\)ef\1\2'
abcdefbcdcdd
14,? ? \或\b:錨定詞尾(支持vi和grep),其前面的任意字符必須作為單詞尾部出現(xiàn),
只匹配單詞的首尾,不包括特殊符號(hào),除了.?? ?
[root@wangjingjing 0202]# echo "hello" | grep '\bhello\b'
hello
[root@wangjingjing 0202]# echo "helloo" | grep '\bhello.\b'
helloo
貪婪:盡可能多的去匹配(大前提:匹配成功)
a*: 0-任意多
a?:0-1
a+:1-任意
a{n,m}: n-m
正則表達(dá)式字符集
正則表達(dá)式字符集示例:
1,? ? [[:alnum:]] 匹配任意一個(gè)字母或者數(shù)字,等價(jià)于[A-Za-z0-9]
[root@wangjingjing 0202]# echo "hello123" | grep '[[:alnum:]]*'
hello123
[root@wangjingjing 0202]# echo "hello123" | grep '[a-zA-Z0-9]*'
hello123
2,? ? ?[[:alpha:]] 匹配任意一個(gè)字母,等價(jià)于[A-Za-z]
[root@wangjingjing 0202]# echo "hello123" | grep '[[:alpha:]]*'
hello123
[root@wangjingjing 0202]# echo "hello123" | grep '[a-zA-Z]*'
hello123
3,? ? ?[[:digit:]] 匹配任意一個(gè)數(shù)字,等價(jià)于[0-9]
[root@wangjingjing 0202]# echo "hello123" | grep '[[:digit:]]*'
hello123
[root@wangjingjing 0202]# echo "hello123" | grep '[0-9]]*'
hello123
4,? ? ?[[:lower:]] 匹配任意一個(gè)小寫(xiě)字母,等價(jià)于[a-z]
[root@wangjingjing 0202]# echo "Hello123" | grep '[[:lower:]]*'
Hello123
[root@wangjingjing 0202]# echo "Hello123" | grep '[a-z]*'
Hello123
5,? ? [[:upper:]] 匹配任意一個(gè)大寫(xiě)字母,等價(jià)于[A-Z]
[root@wangjingjing 0202]# echo "Hello123" | grep '[[:upper:]]*'
Hello123
[root@wangjingjing 0202]# echo "Hello123" | grep '[A-Z]*'
Hello123
6,? ? ?[[:space:]] 匹配任意一個(gè)空白符,包括空格、制表符、換行符以及分頁(yè)符
空格
[root@wangjingjing 0202]# echo "Hello??? 123" | grep '[[:space:]]*'
Hello??? 123
制表符(占8位)
[root@wangjingjing 0202]# echo -e "Hello\t\t\t123" | grep '[[:space:]]*'
Hello????????????????????????123
換行符(grep?? -z 選線(xiàn))
[root@wangjingjing 0202]# echo -e "Hello\n\n123" | grep -z '[[:space:]]*'
Hello
123
五,擴(kuò)展正則表達(dá)式
? ? ? ?擴(kuò)展正則表達(dá)式(Extended Regular Expression,ERE)支持比基本正則表達(dá)式更多的元字符,但是擴(kuò)展正則表達(dá)式對(duì)有些基本正則表達(dá)式所支持的元字符并不支持。前面介紹的元字符“^”、“$”、“.”、“*”、 “[]”以及“[^]”這6個(gè)元字符在擴(kuò)展正則表達(dá)式都得到了支持,并且其意義和用法都完全相同,不再重復(fù)介紹。接下來(lái)重點(diǎn)介紹一下在擴(kuò)展正則表達(dá)式中新增加的一些元字符。
擴(kuò)展正則表達(dá)式示例:
1,+? ?對(duì)前一項(xiàng)進(jìn)行1次或多次重復(fù)匹配
[root@wangjingjing 0202]# echo "sssssss" | grep? -E 's+'
sssssss
2,? ? ???? ?對(duì)前一項(xiàng)進(jìn)行0次或1次重復(fù)匹配
[root@wangjingjing 0202]# echo "sssssss" | grep? -E 's?'
sssssss
3,? ? 匹配單獨(dú)的a
[root@wangjingjing 0202]# echo "sssssss" | grep? -E 's*?'
sssssss
非貪婪:盡可能少的去匹配
a*?
a+?
a??
a{n,m}?
擴(kuò)展:
1,? ? ?(?:):分組的非捕獲版本
加了?:的不參與分組
[root@wangjingjing 0202]# echo "abcdefgbcd" | grep -Po 'a(?:b(c(d)))efg\1'
加了?:的不參與分組,組名順延
[root@wangjingjing 0202]# echo "abcdefgcd" | grep -Po 'a(?:b(c(d)))efg\1'
abcdefgcd
2,? ? ? ? ?給分組命名????? ?p<組名>??????? (?p=組名)
[root@wangjingjing 0202]# echo "abcdefgbcd" | grep -Po 'a(?P<g1>b(c(d)))efg(?P=g1)'
abcdefgbcd
3,? ? ??#注釋?zhuān)锩娴膬?nèi)容不參與匹配
[root@wangjingjing 0202]# echo "abcdefgbcd" | grep -Po 'a(?#express)(b(c(d)))efg\1'
abcdefgbcd
4,(?=): 不消耗樣式 lookahead assertion: 前視斷言:他是一個(gè)判定條件,但是不作為結(jié)果范圍,也不消耗內(nèi)容
去匹配,要獲取的是windows,但是只能是windows10的時(shí)候獲取windows
[root@wangjingjing 0202]# echo "windows10" | grep -Po "windows(?=10)"
windows
[root@wangjingjing 0202]# echo "windows10" | grep -Po "windows(?=10)10"
windows10
[root@wangjingjing 0202]# echo "windows98" | grep -Po "windows(?=10)"
[root@wangjingjing 0202]#
5,? ? ? (?!…):? negative lookahead assertion: 前視預(yù)斷言取反
去匹配,要獲取的是windows,但是只能不是windows10的時(shí)候獲取windows
[root@wangjingjing 0202]# echo "windows10" | grep -Po 'windows(?!10)'
[root@wangjingjing 0202]# echo "windows98" | grep -Po 'windows(?!10)'
windows
[root@wangjingjing 0202]# echo "windows98" | grep -Po 'windows(?!10)98'
windows98
6,? ? ? ?(?<=…): positive lookbehind assertion: 后視斷言
只有windows前邊是10的時(shí)候,才匹配成功,也是返回windows
ot@wangjingjing 0202]# echo "10windows" | grep -Po '(?<=10)windows'
windows
[root@wangjingjing 0202]# echo "10windows" | grep -Po '10(?<=10)windows'
10windows
[root@wangjingjing 0202]# echo "10windows" | grep -Po '98(?<=10)windows'
[root@wangjingjing 0202]#
7,? ? ? ?(?<!…): positive lookbehind assertion: 后視斷言取反
只有windows前邊不是10的時(shí)候,才匹配成功,也是返回windows
[root@wangjingjing 0202]# echo "10windows" | grep -Po '(?<!10)windows'
[root@wangjingjing 0202]# echo "10windows" | grep -Po '10(?<!10)windows'
[root@wangjingjing 0202]# echo "98windows" | grep -Po '(?<!10)windows'
windows
[root@wangjingjing 0202]# echo "98windows" | grep -Po '98(?<!10)windows'
98windows
8,? ? ? ?A|B: 匹配A或者B:A和B都是正則表達(dá)式
[root@wangjingjing 0202]# egrep "^h|o$" file.txt
hello
hi
hello world
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-795804.html
到了這里,關(guān)于shell 正則表達(dá)式詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!