說(shuō)好的日更科吭,第二天就把復(fù)活卡用了啄骇。這樣也好丹诀,省的惦記逆巍。本節(jié)所學(xué)正則表達(dá)式來(lái)自https://www.lanqiao.cn/courses/90
1. 正則表達(dá)式介紹
- 正則表達(dá)式(Regular Expression)是一個(gè)定義搜索模式的字符序列尺棋。Vi 中經(jīng)常會(huì)使用到正則表達(dá)式封锉,為了充分發(fā)揮 shell 編程的威力,Linux 使用者需要精通正則表達(dá)式膘螟。
[:alnum:]代表英文大小寫(xiě)字母及數(shù)字
[:alpha:]代表英文大小寫(xiě)字母
[:blank:]代表空格和 tab 鍵
[:cntrl:]鍵盤(pán)上的控制按鍵成福,如 CR,LF,TAB,DEL
[:digit:]代表數(shù)字
[:graph:]代表空白字符以外的其他
[:lower:]小寫(xiě)字母
[:print:]可以被打印出來(lái)的任何字符
[:punct:]代表標(biāo)點(diǎn)符號(hào)
[:upper:]代表大寫(xiě)字母
[:space:]任何會(huì)產(chǎn)生空白的字符如空格,tab,CR 等
[:xdigit:]代表 16 進(jìn)位的數(shù)字類型
2.grep 命令
- 查找特定字符串
-a :以 text 檔案的方式搜尋 binary 檔案數(shù)據(jù)
-c :計(jì)算找到 '搜尋字符串' 的次數(shù)
-i :忽略大小寫(xiě)的不同荆残,所以大小寫(xiě)視為相同
-n :順便輸出行號(hào)
-v :反向選擇奴艾,亦即顯示沒(méi)有 '搜尋字符串' 內(nèi)容的行
grep -n 'the' regular_express.txt
grep -in 'the' regular_express.txt
grep -vn 'the' regular_express.txt
[ ] 可以用來(lái)查找字符組。
grep -n 't[ae]st' regular_express.txt
[^] 為反向選擇字符組内斯,用于排除后面的字符蕴潦,使用方式為 [^...]
grep -n '[^a-z]oo' regular_express.txt#不包含小寫(xiě)字母
grep -n '[^[:lower:]]oo' regular_express.txt
注意行首符 ^ 和反向選擇 [^] 的區(qū)別,^[A-Z] 表示以大寫(xiě)字母開(kāi)頭俘闯。[^A-Z] 表示除了大寫(xiě)字母 A-Z 的所有字符潭苞。
grep -n 'd$' regular_express.txt # 查找以d結(jié)尾的
grep -n '^$' regular_express.txt #查找空行
^$: 過(guò)濾掉空白行
^#: 過(guò)濾掉注釋行(以 # 號(hào)開(kāi)頭)
任意字符. 重復(fù)字符*
*(星號(hào)):代表重復(fù)前面 0 個(gè)或者多個(gè)字符。
e*: 表示具有空字符或者一個(gè)以上 e 字符真朗。
ee*此疹,表示前面的第一個(gè) e 字符必須存在。第二個(gè) e 則可以是 0 個(gè)或者多個(gè) e 字符遮婶。
eee*蝗碎,表示前面兩個(gè) e 字符必須存在。第三個(gè) e 則可以是 0 個(gè)或者多個(gè) e 字符旗扑。
ee*e :表示前面的第一個(gè)與第三個(gè) e 字符必須存在蹦骑。第二個(gè) e 則可以是 0 個(gè)或者多個(gè) e 字符。
[](https://www.lanqiao.cn/questions/topics/28/)
限定連續(xù)字符范圍 { }
[](https://www.lanqiao.cn/questions/topics/28/)
限定連續(xù)字符范圍 { }
grep -n 'o\{2\}' regular_express.txt #查找連續(xù)的兩個(gè)o字符
grep -n 'go\{2,5\}g' regular_express.txt # 查找 g 后面接 2 到 5 個(gè) o臀防,然后再接 g 的字符串
^word 表示待搜尋的字符串(word)在行首
word$ 表示待搜尋的字符串(word)在行尾
.(小數(shù)點(diǎn)) 表示 1 個(gè)任意字符
\ 表示轉(zhuǎn)義字符脊串,在特殊字符前加 \ 會(huì)將特殊字符意義去除
* 表示重復(fù) 0 到無(wú)窮多個(gè)前一個(gè) RE(正則表達(dá)式)字符
[list] 表示搜索含有 l,i,s,t 任意字符的字符串
[n1-n2] 表示搜索指定的字符串范圍,例如 [0-9] [a-z] [A-Z] 等
[^list] 表示反向字符串的范圍,例如 [^0-9] 表示非數(shù)字字符辫呻,[^A-Z] 表示非大寫(xiě)字符范圍
\{n,m\} 表示找出 n 到 m 個(gè)前一個(gè) RE 字符
\{n,\} 表示 n 個(gè)以上的前一個(gè) RE 字符
3. sed命令
sed 是非交互式的編輯器。它不會(huì)修改文件琼锋,除非使用 shell 重定向來(lái)保存結(jié)果放闺。默認(rèn)情況下,所有的輸出行都會(huì)被打印到屏幕上缕坎。
sed 編輯器逐行處理文件(或輸入)怖侦,并將結(jié)果打印到屏幕上。
具體過(guò)程如下:首先 sed 把當(dāng)前正在處理的行保存在一個(gè)臨時(shí)緩存區(qū)中(也稱為模式空間)谜叹,然后處理臨時(shí)緩沖區(qū)中的行匾寝,完成后把該行發(fā)送到屏幕上。
sed 每處理完一行就將其從臨時(shí)緩沖區(qū)刪除荷腊,然后將下一行讀入艳悔,進(jìn)行處理和顯示。處理完輸入文件的最后一行后女仰,sed 便結(jié)束運(yùn)行猜年。sed 把每一行都存在臨時(shí)緩沖區(qū)中,對(duì)這個(gè)副本進(jìn)行編輯疾忍,所以直接使用不會(huì)修改原文件內(nèi)容乔外。
如果要修改原文件,需要添加 -i 選項(xiàng)一罩。
使用a和i新增輸出
nl regular_express.txt | sed '2,5c No 2-5 number' #將 2-5 行的內(nèi)容替換為 No 2-5 number杨幼,c 為替換內(nèi)容選項(xiàng)
輸出 regular_express.txt 的第 5-7 行,其中 -n 為安靜模式選項(xiàng)聂渊,我們?cè)谇懊娴恼鹿?jié)中已經(jīng)介紹過(guò)差购。
4.正則表達(dá)式擴(kuò)展應(yīng)用
利用支持?jǐn)U展正則表達(dá)式的 egrep 與特殊字符 | 的組合功能來(lái)間隔兩組字符串,如此一來(lái)汉嗽,可以極大地化簡(jiǎn)指令歹撒。
在非擴(kuò)展正則表達(dá)式中,我們使用 * 來(lái)表示任意個(gè)重復(fù)字符(零至無(wú)窮多個(gè))
grep -n 'goo*d' regular_express.txt
+ 表示重復(fù)一個(gè)或一個(gè)以上的前一個(gè)字符grep -n 'goo*d' regular_express.txt
? 表示重復(fù)零個(gè)或一個(gè)的前一個(gè)字符
egrep -n 'go?d' regular_express.txt
| 表示用或(or)的方式找出數(shù)個(gè)字符串
egrep -n 'gd|good' regular_express.txt
() 表示找出組字符串
egrep -n 'g(la|oo)d' regular_express.txt
()+ 多個(gè)重復(fù)群組判別