這篇博文我們按照每一種正則表達式符號來整理。
1)行首定位符“^”:匹配行首的字符
#-----------------------------/chapter8/ex8-2.sh------------------
#! /bin/bash
#列出/etc目錄中的以字母po開頭的文件
str=`ls /etc | grep "^po"`
echo "$str"
注意:str變量的賦值,即等號右邊需要有反引號;其中用到了管道命令,grep命令處理對象是前面ls的結果,不然grep後面要接被處理文件名;正則表達式要用雙引號""括起來,在awk、sed中是用兩條反斜槓\...\括起來。
2)行尾定位符"$":匹配行尾的字符
#-----------------------------/chapter8/ex8-3.sh------------------
#! /bin/bash
#列出/etc目錄中以conf結尾的文件名
str=`ls /etc | grep "conf$"`
echo "$str"
3)匹配整行:"^一整行內容$"
4)單個字符匹配".":可以代表任意字符,包括空格,不包括換行符\n
#-----------------------------/chapter8/ex8-4.sh------------------
#! /bin/bash
#列出所有的包含字符串“samba”的文件名
str=`ls /etc | grep "samba"`
echo "$str"
echo "==============================="
#列出包含字符串samba以及另外一個字符的文件名
str=`ls /etc | grep "samba."`
echo "$str"
注意:有了"."就表示一定有個字符在這兒,也可以用多個"."表示多個字符存在,例如"l..p"。
5)限定符"*":重複其前面的字符0次或者多次
#-----------------------------/chapter8/ex8-5.sh------------------
#! /bin/bash
#篩選出以字符s開頭,緊跟着1個字符s,任意個字符s的文件名
str=`ls /etc | grep "^sss*"`
echo "$str"
注意:可以表達重複0次;正則表達式的*和linux shell中的*不一樣,那個是表示匹配任意字符(串),不一定要是重複前面的字符,可以說範圍更廣。
6)字符集匹配“[]”:匹配中括號中的任意一個字符即可
#-----------------------------/chapter8/ex8-6.sh------------------
#! /bin/bash
#篩選所有以字符r開頭,並且緊跟着1個字符c的文本行
str=`ls /etc |grep "^rc"`
echo "$str"<pre name="code" class="plain">#-----------------------------/chapter8/ex8-7.sh------------------
#! /bin/bash
#篩選以字符串“ss”開頭,後面至少緊跟着1個字符“s”的文本行
str=`ls /etc | egrep "^sss+"`
echo "$str"
注意:[a-z]匹配小寫字母,[A-Z]匹配大寫字母,[a-zA-Z]匹配字母,[0-9]匹配數字。
當元字符“*”和 “.”在"[]"內時,只能表示一個普通的字符,沒有上面的特殊含義了。
7)字符集不匹配“[^]”:功能和上面正好相反
8)限定符“+”:功能類似於"*",但是重複前面字符的次數必須大於等於1次,不能是0次
#-----------------------------/chapter8/ex8-7.sh------------------
#! /bin/bash
#篩選以字符串“ss”開頭,後面至少緊跟着1個字符“s”的文本行
str=`ls /etc | egrep "^sss+"`
echo "$str"
9)限定符“?”:功能類似於“*”,但是重複其那面字符的次數必須只能是0次或1次
#-----------------------------/chapter8/ex8-8.sh------------------
#! /bin/bash
#篩選以字符串“ss”開頭,後面跟着0或者1個s的文本行
str=`ls /etc | egrep "^sss?"`
echo "$str"
10)豎線"|"和圓括號"()":多個正則表示之間的或的關係
#-----------------------------/chapter8/ex8-9.sh------------------
#! /bin/bash
#篩選含有字符串“ssh”、“ssl”或者以字符串“yum”開頭的文本行
str=`ls /etc | egrep "(ssh|ssl|^yum)"`
echo "$str"
11)"{m, n}"、"{m}"、"{m,}":指定重複出現的次數
前面的限定符"*", "+", "?"都可以重複前面的字符不同的次數,但是重複出現的次數都不可控。我們使用"{m, n}"、"{m}"、"{m,}"就可以控制重複出現的次數。
"{m, n}":前置字符最少出現m次,最多出現n次;
"{m}":前置字符出現m次;
"{m,}":前置字符最少出現m次。
如果重複的字符不是唯一的呢?這時可以和中括號字符集匹配"[]"結合使用,如下:
#-----------------------------/chapter8/ex8-16.sh------------------
#! /bin/bash
#篩選符合格式的電話號碼
str=`egrep "800-[[:digit:]]{3}-[[:digit:]]{4}$" demo4.txt`
echo "$str"
注意:在普通正則表達式中沒有對{}的定義,需要加轉義字符:\{m, n\}。
12)POSIX字符集可以方便表示"[]"的字符集
注意:使用POSIX字符集時需要兩層中括號。