shell編程-正則表達式

1、正則表達式是什麼

正則表達式是用於字符排列和匹配模式的一種語法規則。它主要用於字符串的模式分割、匹配、查找及替換操作。

2、正則表達式與通配符

  • 正則表達式用來在文件中匹配符合條件的字符串,正則是包含匹配。grep、awk、sed等命令可以支持正則表達式。
  • 通配符用來匹配符合條件的文件名,通配符是完全匹配。ls、find、cp這些命令不支持正則表達式,所以只能使用shell自己的通配符進行匹配了。

通配符:

  • *:匹配任意內容
  • ?: 匹配任意一個內容
  • []:匹配中括號中的一個字符

3、基礎正則表達式

元字符 作用
* 前一個字符匹配0次或任意多次。
. 匹配除了換行符外任意一個字符。
^ 匹配行首。例如^hello會匹配以hello開頭的行。
$ 匹配行尾。例如hello$會匹配以hello結尾的行。
[] 匹配中括號中指定的任意一個字符,只匹配一個字符。例如[aoeiu]匹配任意一個元音字符,[0-9]匹配任意一個數字,[a-z][0-9]匹配小寫字和一位數字構成的兩位字符
[^] 匹配除中括號的字符以外的任意一個字符。例如:[^0-9]匹配任意一位非數字字符,[^a-z]表示任意一位非小寫字母。
\ 轉義符。用於取消講特殊符號的含義取消。
\{n,\} 表示其前面的字符恰好出現n次。例如[0-9]\{4\}匹配4位數字,
\{n,m\} 表示前面的字符至少出現一次,最多出現m次。例如[a-z]\{6,8}匹配6到8位的小寫字母。

補充:
?()屬於擴展正則
修改~/.bashrc配置文件,爲grep起別名,將匹配出來的用顏色顯示alias grep=’grep –color=auto’

例如:*號的示例

[root@localhost home]# grep aa* test.txt 
a
aa
aaa
aaaa
aaaaa
ab
aabb

例如
“.”:匹配除了換行符外任意一個字符
“s..d”:會匹配在s和d這兩個字母之間一定有兩個字符的單詞

[root@localhost home]# grep "s..d" test.txt 
said
soid
sdkdkdkd

“s.*d”:匹配在s和d字母之間有任意字符

[root@localhost home]# grep "s.*d" test.txt 
said
soid
sdkdkdkd

“.*”:匹配所有內容

[root@localhost home]# grep ".*" test.txt 
a
aa
aaa
aaaa
aaaaa

ab
aabb

b
bb
bbb
bbbb
bbbb


said
soid
sdkdkdkd

例如
“^”匹配行首,”$”匹配行尾
“^M”:匹配以大寫“M”開頭的行

[root@localhost home]# grep "^a" test.txt 
a
aa
aaa
aaaa
aaaaa
ab
aabb

“n$”:匹配以小寫“n”結尾的行

[root@localhost home]# grep "b$" test.txt 
ab
aabb
b
bb
bbb
bbbb
bbbb

“^$”:匹配空白行顯示,增加-n選項,顯示行號

[root@localhost home]# grep -n "^$" test.txt 
6:
9:
15:
16:

例如
“[]” : 匹配中括號中指定的任意一個字符,只匹配一個字符。

“s[ao]id”:匹配s和i字母中間,要麼是a,要麼是o的字符串

[root@localhost home]# grep -n "s[ao]id" test.txt 
17:said
18:soid

“[0-9]”:匹配包括任意一個數字的行

[root@localhost home]# grep -n "[0-9]" test.txt 
22:6adfadfadf8
23:jladf8002378
25:ladfjadf7
27:3333333333
29:2222222222

“^[a-z]”:匹配用小寫字母開頭的行

[root@localhost home]# grep "^[a-z]" test.txt 
a
aa
aaa
aaaa
aaaaa
ab
aabb
b
bb
bbb
bbbb
bbbb
said
soid
sdkdkdkd
jladf8002378
ladfjadf7

“[a-z]$”:匹配用小寫字母結尾的行

[root@localhost home]# grep "[a-z]$" test.txt 
a
aa
aaa
aaaa
aaaaa
ab
aabb
b
bb
bbb
bbbb
bbbb
said
soid
sdkdkdkd

[root@localhost home]# grep "^[a-z]$" test.txt 
a
b
[root@localhost home]# grep "^[a-z][a-z]$" test.txt 
aa
ab
bb

“[^]”:匹配除中括號的字符以外的任意字符。(說明:^放在中括號內)

“^[^a-z]”:匹配不用小寫字母開頭的行

[root@localhost home]# grep "^[^a-z]" test.txt 
6adfadfadf8
3333333333
2222222222

“^[^a-zA-Z]”:匹配不用字母開頭的行

[root@localhost home]# grep "^[^a-zA-Z]" test.txt 
6adfadfadf8
3333333333
2222222222

“\”:轉義字符,作用讓特殊的字符喪失意義
“.$”:匹配使用”.”結尾的行

[root@localhost home]# grep "\.$" test.txt 
6adfadfadf8.

“\{n\}”:表示其前面的字符恰好出現n次
“a\{3\}”:匹配a字母連續出現三次的字符串。
注意:至少重複3次,匹配出來的結果顯示超過3個字符串也會顯示到結果中

[root@localhost home]# grep "a\{3\}" test.txt 
aaa
aaaa
aaaaa

“[0-9]\{3\}”:匹配包括連續的三個數字的字符串

要想準確查找,需要加定界符

發佈了81 篇原創文章 · 獲贊 19 · 訪問量 35萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章