參考書籍-Linux命令行與shell腳本編程大全(第3版)

 

基礎正規表示法講得差不多了,接下來講擴展正規表示法,兩個差別就是一個是用sed一個是用gawk


●問

○加號

●花括號

○or(|)符號

●表達分組()

○實戰-美國電話號碼


問號前面的字元可以出現1次或不出現。

 

image

第一個範例he?可以看成 hhe,不要把?號當成一個字元。

第二個範例可以看成 hehef

個範例可以看成 hellohell

個範例可以看成 heloheo,所以沒有找到。

 

 

可以配合中括號使用。

 

image

這三個範例都可以看成:brtbatbt

 


加號

?號一樣模式,只是加號前的最少要出現一次到多次

 

image

hel+ 可以看成 helhellhelllhelll...,所以匹配成功。

hello+可以看成hellohelloohellooo,所以匹配成功。

hella+可以看成hellahellaahellaaa,根本句子不符,所以失敗。

 

image

也可以使用中括號,只要中括號的與句子其中一個字元匹配,就算匹配成功。


花括號

在//裡面的花括號稱為間隔(interval),加上參數 --re-interval才能夠被識別出來。

 

兩總模式:

{n} : 至少出現n次。

{n,m} : 至少出現n次最多出現m次。

 

image

 

也可以配合中括號使用。

 

image

 

範例一的[el]{1,3}的意思就是el可以出現在裡面1次以上3次以下。

範例二只能出現兩次,所以可能的排序為heeeohelloheeloheleo,都不符合。


 

or(|)符號

我要什麼跟什麼,2個以上。(不能腳踏兩條船)

image

範例一、二就是catdog都可以。

範例三加一個中括號,代表catdogdag


剛剛喝茶突然想到老麵,那我喝茶剩下的一口就稱為老茶~~


 

表達分組()

括起來表示是一起的。

常跟or配在一起用,下面的範例我就不說明了,只要前面的範例看得懂這就沒問題了。

image


實戰-計算文件數量

不能只是紙上談兵要實際的運用方能融會貫通(年輕人要講武德)

image

我們把PATH經過處理後變成這樣,就可以利用for去歷遍(鮭魚洄游),就可以知道這些文件內的文件數量。

image

如果這個程式你有不懂的,就代表你前面有些東西沒有學或是沒有看懂,建議你可以看我之前的文章,我都有寫,

雖然我不能保證我寫的都是對,反正你就加油(耗子)吧。


#!/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沒有01的區號,然後有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’

image

 

image

 

經過我的講解是不是變得很簡單呢?是(沒有)

 


#!/bin/bash

gawk --re-interval '/^\(?[2-9][0-9]{2}\)?(| |-|\.)[0-9]{3}( |-|\.)[0-9]{4}$/{print($0)}'


 

arrow
arrow
    創作者介紹
    創作者 讀書小天地 的頭像
    讀書小天地

    書籍分享天地

    讀書小天地 發表在 痞客邦 留言(0) 人氣()