正則表達式的學習
一、正則表達式使用場景:
# linux: vim grep sed awk
# 作用;用於匹配文本字符串中符合正則的字符,其實就是過濾文本字符串
實例:
匹配數字: ^[0-9]+$ 匹配數字1個或多個
匹配Mail: [a-z0-9A-Z_]+@[a-zA-Z0-9]+\.[a-z]+
匹配IP: ([0-9]{1,3}\.){3}[0-9]{1,3}
二、shell的通配符與正則的元字符的關系
# 首先搞清楚:
1、shell本身是不支持正則的,只是有些文本篩選工具里支持用正則里的元字符來匹配文本字符串,如grep sed awk vim/vi
2、正則里的元字符是包含shell中的通配符的
#使用區別:
shell通配符用於文件名匹配,它是由shell解析的,比如find,ls,cp,mv等
正則元字符適用於建立匹配規則的,用於篩選文本數據的
#shell中有哪些常用的通配符、特殊字符及其含義;
在shell中,匹配[]里面的字符時,是不區分大小寫的,但是正則里嚴格區分大小寫
shell中常用的通配符 | 含義 | 實例 |
---|---|---|
* | 匹配0或多個字符! | a*b表示要么ab,要么axxxxxb,跟正則不一樣,不是b、ab、 aab、 aaaab,不需要為*前面字符服務 |
? | 匹配1個也必須1個任意字符! | a?b,可以是aab abb axb |
[123] | 匹配列表中任意1個字符 | |
[!]或[^123] | 匹配除列表中任意1個字符 | |
[a-b] | 匹配列表a到b中任意1個字符字符 | |
[!a-b]或[^a-b] | 匹配不在a到b間任意1個字符 | |
{a,b,...} | 匹配a或b或列表中任意1個字符 |
#shell中的常用特殊字符
特殊字符 | 含義 | 實例 |
---|---|---|
= | 定義賦值變量 | 定義a="asd" 調用$a 或${a} |
$ | 變量的調用 | 同上 |
> | 數據流重定向 | file1 > file2 或 命令 > file !就是把結果導入 |
< | 數據流重定向 | 同上,只是導入方向相反 |
| | 接受命令結果的管道符號 | ls | grep ' a*b' ! 把ls命令結果給到后面命令作篩選 |
& | 不太清楚 | |
() | 可以作數組$(1 2 3),也可以作運算、命令的替換 | 1. a=$(命令)等同a=`命令` 把命令結果賦值給a;2. 定義數組data=(n1 n2 n3),調用數組元素${data[index]} |
{} | 調用變量時作為界定變量名的邊界, | 1、ab_c="hello" ,千萬別這樣ab-c=“hello world”,被坑過!變量名之間不能用 - ,2、調用${ab_c},${ab_c:1:3}從下標(o開始算)1取3個,${ab_c:1}=${ab_c:1:4} 不寫步長默認取后面所有 3、${ab_c/l/a} 把第一個l換成a 或${ab_c//l/a} 把所有l換成a 4、${ab_c#*l} 結果為lo 或 ${ab_c##*l} 結果為 o 5、${ab_c%l* } 結果為 hel 或 ${ab_c%%l*} 結果為 he |
; | 承接上一個命令,類似於| | 我的理解等同| |
|| | 或運算符 | { |
&& | 與運算符 | [[ 表達式1 ]] && [[ 表達式2 ]]; echo $? , 要兩個表達式成立為真就結果為真 |
! | 非運算 | [[ !- z '']] = [[ -n '' ]] |
# | 腳本注釋 | #!/bin/bash |
\ | 字符轉義:把通配符、元字符去特殊其含義,就顯示本來樣子 |
正則的元字符
元字符 | 含義 |
---|---|
* | 匹配前面那個字符0次或多次,就是前面那個字符可有可無 |
. | 匹配任意一個字符(除換行回車外), 等同於shell里面的? |
? | 匹配前面字符0個或1個 |
^ | 匹配是否以后面的字符或字符組為開頭 |
[1] | 匹配以[]里面開通的任意一個字符開頭的 |
[^] | 匹配除[]里面的字符外所有任意單個字符 |
[] | 匹配以除[]里面字符外所有任意單個字符 |
$ | 匹配是否以前面的字符或字符組為為結尾 |
[] | 匹配[]里面的任意一個字符集 |
\ | 轉義或屏蔽一個元字符的特殊意義 |
[a-b] | 匹配任意一個在a到b范圍內的字符 |
+ | 匹配前面字符1個或多個個 |
() | 就是把1個或多個字符捆在一起當成1個字符 |
| | 就是或的意思a |
\<a | 匹配詞首以a開頭的單詞 |
a\> | 匹配詞尾以a位結尾的單詞 |
\<ab\> | 只匹配ab這個字符整體 |
\(1.2.3.\)4 | 把1.2.3.作為一個整體字符!如我想把1.2.3.4換成1.2.3.5, 則/\(1.2.3.\)4/ \15/ |
x\{n\} | 匹配x重復出現n次 |
x\{n,\} | 匹配x重復出現n次以上 |
x\{n,m\} | 匹配x出現n到m次 |
正則元字符總結:
1、 * ? + {} 都是為了服務於前面那個字符而生的,不能獨立存在!如果前面字符是(),那就是服務於字符組()里面字符
2、\w等同[a-zA-Z0-9]
\W等同[^a-zA-Z0-9]