正則表達式是一個描述一組字符串的模式
是由普通字符和元字符組成的字符集,而這個字符集匹配(或指定)一個模式。
正則表達式的操作實例
- (一)概述
- 1.定義
- 2.作用
- 3.類型
- (二)字符串匹配實例
- (三)文本搜索實例
(一)概述
1.定義
- 正則表達式是一個描述一組字符串的模式
是由普通字符和元字符組成的字符集,而這個字符集匹配(或指定)一個模式。
2.作用
- 正則表達式的主要作用是文本搜索和字符串處理。一個正則表達式匹配單個字符或一個字符串,或字符串的一部分。
3.類型
- 基本正則表達式
元字符 | 使用語法 |
---|---|
星號* | 匹配它前面的字符串或正則表達式任意次 |
句點. | 匹配除換行符外的任意一個字符 |
插入字符^ | 匹配一行的開始 |
美元符$ | 匹配一行的末尾 |
方括號[] | 匹配方括號內指定的字符集中的一個字符 |
反斜線符號\ | 轉義一個特殊字符 |
轉義尖括號 \ <\ > | 用于標記單詞邊界,尖括號必須轉義 |
- 擴展正則表達式
元字符 | 使用語法 |
---|---|
問號? | 匹配0個或1個前面的字符 |
加號+ | 匹配1個或多個前面的字符 |
轉義波形括號{} | 匹配前面正則表達式的次數 |
圓括號() | 包含一組正則表達式 |
豎線 | “或”操作符 |
- POSIX字符類
注意:POSIX字符類通常需要引用或雙方括號([[]])括起來。
(二)字符串匹配實例
實例1:
- 測試digit的值是否為一個十進制數
#!/bin/bash
#######################################################
#
# FILE:checknumeric.sh
# USAGE: ./checknumeric.sh
#
# DESCRTPTION:
# OPTIONS: --
# REPUIREMENTS: --
# BUGS: --
# NOTES: --
# AUTHOR: LEY
# ORGANIZATION:
# CREATED: 05/8/2024 16:23
# REVISION: --
#####################################################read -p "Input a number ,Please: " num
//^[0-9]+$開頭到結尾都是數字重復至少一次
if [[ $num =~ ^[0-9]+$ ]]; thenecho "It's a number"
elseecho "It's not a number"
fi
- 使用POSIX字符類
read -p "Input a number ,Please: " numif [[ $num =~ [[:digit:]]+$ ]]; thenecho "It's a number"
elseecho "It's not a number"
fi
實例2:
- 檢測是否是email地址
#!/bin/bash
#######################################################
#
# FILE:checkemailic.sh
# USAGE: ./checkemailic.sh
#
# DESCRTPTION:
# OPTIONS: --
# REPUIREMENTS: --
# BUGS: --
# NOTES: --
# AUTHOR: LEY
# ORGANIZATION:
# CREATED: 05/8/2024 16:35
# REVISION: --
#####################################################
read -p "Input a number ,Please: " email
//[A-Za-z0-9._%+-$]中的一個字符重復至少一次;@加[A-Za-z0-9.-]中的一個字符重復至少一次;\.轉義一個.;[A-Za-z]{2,4}$重復2到4次結束
if [[ "$email" =~ ^[A-Za-z0-9._%+-$]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$ ]]; thenecho "This email address looks fine: $email"
elseecho "no"
fi
實例3:
- 判斷IP地址格式是否正確
#!/bin/bash
#######################################################
#
# FILE:checkIPaddress.sh
# USAGE: ./checkIPaddress.sh
#
# DESCRTPTION:
# OPTIONS: --
# REPUIREMENTS: --
# BUGS: --
# NOTES: --
# AUTHOR: LEY
# ORGANIZATION:
# CREATED: 05/8/2024 16:35
# REVISION: --
#####################################################
if [ $# != 1 ]; thenecho "Usage: $0 address"exit 1
elseip=$1
fi
//IP
if [[ "$ip" =~ ^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$ ]]; thenecho "Looks like an IPv4 IP address."
elif [[ $ip =~ ^[A-Fa-f0-9:]+$ ]]; thenecho " Cloud be an IPv6 IP address."
elseecho 'Oops!'
fi
25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?:這部分用于匹配一個0-255之間的數字。
- 25[0-5]:匹配250-255。
- 2[0-4][0-9]:匹配200-249。
- [01]?[0-9][0-9]?:
[01]?:匹配0或1(可選),用于匹配0-199的前兩位。
[0-9]:匹配任何一位數字。
[0-9]?:匹配任何一位數字(可選),用于匹配0-99的最后一位(當它是兩位數時)。
((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}:這部分用于匹配IPv4地址的前三個數字,并確保它們后面都有一個點(.)。
- {3}:表示前面的捕獲組需要重復三次。
- (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?) :這部分用于匹配 I P v 4 地址的最后一個數字,并確保它是字符串的結尾(由 :這部分用于匹配IPv4地址的最后一個數字,并確保它是字符串的結尾(由 :這部分用于匹配IPv4地址的最后一個數字,并確保它是字符串的結尾(由表示)。
(三)文本搜索實例
- 實例1:使用句點.匹配單字符
$ cat list.txt
1122
112
11222
2211
22111
abdde
abede
bbcde
bbdde$ grep "112." list.txt
1122
11222
$ grep "d.e" list.txt
abdde
bbdde
$ grep "2.." list.txt
11222
2211
22111
- 實例2:使用插入符號^匹配
$ grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
$ grep ^root /etc/passwd
root:x:0:0:root:/root:/bin/bash
$ grep "^Nov 1" /etc/passwd
- 實例3:使用美元$匹配
$ grep 'bash$' /etc/passwd //以bash結尾
root:x:0:0:root:/root:/bin/bash
ley:x:1000:1000:ley:/home/ley:/bin/bash
- 實例4:使用星號*匹配
]# grep "kernel: *." /var/log/messages
//匹配kernel后面的冒號“:”,還有緊跟其后的0個或多個空格,最后一個句點匹配任意一個字符
//以i開頭,以字符l結尾的行
# egrep "\<i.*l\>" /etc/passwd --color
gnome-initial-setup:x:987:982::/run/gnome-initial-setup/:/sbin/nologin# grep "\<i.*l\>" /etc/passwd --color
gnome-initial-setup:x:987:982::/run/gnome-initial-setup/:/sbin/nologin
- 實例5:使用方括號[ ]匹配
# grep "[a-z]\{11\}" /etc/passwd --color
//找出文件中含有11個連續小寫字符的行
# grep [bs] /etc/passwd
//包含字符b或字母s
//查看系統日志文件中包含“數字+空格+times” 的行
# grep "[0-9]\+ times" /var/log/messages --color
# egrep "[0-9]\+ times" /var/log/messages --color
- 實例6:使用問號?匹配
# cat regeExamp.txt
hi hello
hi hello how are you
hihello
# egrep "hi ?hello" regeExamp.txt
hi hello
hi hello how are you
hihello
//或
# grep "hi \?hello" regeExamp.txt
hi hello
hi hello how are you
hihello
- 實例7:使用加號+匹配
# egrep "hi +hello" regeExamp.txt
hi hello
hi hello how are you
# grep "hi \+hello" regeExamp.txt
hi hello
hi hello how are you
總結:
正則表達式是一個描述一組字符串的模式。
正則表達式是由普通字符和元字符組成的字符集,而這個字符集匹配(或指定)一個模式。
正則表達式的主要作用是文本搜索和字符串處理。一個正則表達式匹配單個字符或一個字符串,或字符串的一部分。
正則表達式有兩種類型,分別是基本正則表達式和擴展正則表達式。基本正則表達式的元字符有:*、.、^、$、[]、\和<>。
擴展正則表達式在基本正則表達式的元字符的基礎上,增加以下元字符:?、+、{}、(和|。
POSIX字符類通常需用引號或雙方括號([[])括起來。
從Bash的3.0版本開始,Bash有了內部的正則表達式比較操作符,使用“=~”表示。 Shell 腳本中大部分使用grep或sed命令的正則表達式編寫的代碼,現在可以由帶有“=~”操作符的Bash表達式處理,并且Bash表達式可能使你的腳本更容易閱讀和維護。