參考書籍-Linux命令行與shell腳本編程大全(第3版)
基礎正規表示法講得差不多了,接下來講擴展正規表示法,兩個差別就是一個是用sed一個是用gawk。
●問號
○加號
●花括號
○or(|)符號
●表達分組()
○實戰-美國電話號碼
問號
問號前面的字元可以出現1次或不出現。
第一個範例he?可以看成 h、he,不要把?號當成一個字元。
第二個範例可以看成 he、hef。
第三個範例可以看成 hello、hell。
第四個範例可以看成 helo、heo,所以沒有找到。
可以配合中括號使用。
這三個範例都可以看成:brt、bat、bt
加號
跟?號一樣模式,只是加號前的最少要出現一次到多次
hel+ 可以看成 hel、hell、helll、helll...,所以匹配成功。
hello+可以看成hello、helloo、hellooo…,所以匹配成功。
hella+可以看成hella、hellaa、hellaaa…,根本句子不符,所以失敗。
也可以使用中括號,只要中括號的與句子其中一個字元匹配,就算匹配成功。
花括號
在//裡面的花括號稱為間隔(interval),加上參數’ --re-interval’才能夠被識別出來。
兩總模式:
{n} : 至少出現n次。
{n,m} : 至少出現n次最多出現m次。
也可以配合中括號使用。
範例一的[el]{1,3}的意思就是e跟l可以出現在裡面1次以上3次以下。
範例二只能出現兩次,所以可能的排序為heeeo、hello、heelo、heleo,都不符合。
or(|)符號
我要什麼跟什麼,2個以上。(不能腳踏兩條船)
範例一、二就是cat、dog都可以。
範例三加一個中括號,代表cat、dog、dag
剛剛喝茶突然想到老麵,那我喝茶剩下的一口就稱為老茶~~。
表達分組()
括起來表示是一起的。
常跟or配在一起用,下面的範例我就不說明了,只要前面的範例看得懂這就沒問題了。
實戰-計算文件數量
不能只是紙上談兵要實際的運用方能融會貫通(年輕人要講武德)。
我們把PATH經過處理後變成這樣,就可以利用for去歷遍(鮭魚洄游),就可以知道這些文件內的文件數量。
如果這個程式你有不懂的,就代表你前面有些東西沒有學或是沒有看懂,建議你可以看我之前的文章,我都有寫,
雖然我不能保證我寫的都是對,反正你就加油(耗子為汁)吧。
#!/bin/bash
my=$(echo $PATH | sed 's/:/ /g')
count=0
for i in $my:
do
check=$(ls $i)
for j in $check
do
count=$[$count+1]
done
echo "$i - $count"
count=0
done
實戰-美國電話號碼
常見4種格式:
(123)456-7890
(123) 456-789
123-456-7890
123.456.7890
從左到右開始分析。
有的有小括號,有的沒有,那就是出現跟不出現,所以可以用?號寫成: \(?,括號必須使用跳脫字元\,然後又在第一個就在加一個^就變成了:
^\(?
美國第一個號碼範圍是2-9沒有0、1的區號,然後有3個號碼就可以寫成:
[2-9][0-9]{2}
然後是右括號寫成:
\)?
下一個是有的有空格有的沒有,有的有-號和.號,所以可以使用or寫成:
(| |-|\.)
接下來就是3個數字:
[0-9]{3}
下一個必須要有一個空格和-號或.號,因為電話號碼必須與其他號碼之間必須至少有一個空格(潛規則啊):
( |-|\.)
最後四位數,加上$號表示:
[0-9]{4}$
結合變成:
^\(?[2-9] [0-9]{2} \)? (| |-\.) [0-9]{3} ( |-|\.) [0-9]{4}$
有使用到花括號所以需要加一個參數‘—re-interval’
經過我的講解是不是變得很簡單呢?是(沒有)
#!/bin/bash
gawk --re-interval '/^\(?[2-9][0-9]{2}\)?(| |-|\.)[0-9]{3}( |-|\.)[0-9]{4}$/{print($0)}'