聲明:所有文章只作為學(xué)習(xí)筆記用,轉(zhuǎn)載非原創(chuàng)
在線正則
https://blog.csdn.net/shellching/article/details/76527720
-------編程語言支持高級正則表達(dá)式 還是很有難度的
grep / sed awk 文本編輯器 IDE 都支持基礎(chǔ)正則
分類:
基礎(chǔ)正則 bre basic regular expression
擴展 ere extended regular expression
變成語言支持的正則
BRE和ERE語法基本一致 只有部分元字符需要區(qū)別對待
擴展正則中這些元字符可以直接使用 : ? 举哟、 + 、 { 、 } 、 | 葵蒂、 ( 、 )
基礎(chǔ)正則這些字符都需要加反斜線轉(zhuǎn)義: \? 重虑、 \+ 践付、\{ 、 \} 缺厉、 \| 荔仁、\( 、 \)
提示:基礎(chǔ)正則中這些符號加反斜線芽死, 才能具有通配功能。不加的話就是普通字符
eascape \ 轉(zhuǎn)義:是引用單字符的方法.在單個字符前面的轉(zhuǎn)義符(\ 倒斜杠)告訴shell不必特殊解釋這個字符次洼,只把它當(dāng)成字面上的意思.
# echo '1234 helo world 學(xué),U)&)^&[]' | grep -E 'h?'
1234 helo world 學(xué),U)&)^&[]
# echo '1234 helo world 學(xué),U)&)^&[]' | grep 'h?'
echo '1234 helo world 學(xué),U)&)^&[]' | grep 'h\?'
grep sed 默認(rèn)使用基礎(chǔ)正則
grep -E 关贵、 sed -r 、 egrep 卖毁、 awk 擴展正則
基本作用: 搜索文本
學(xué)習(xí)正則本質(zhì)就是學(xué)習(xí)各種各樣的元字符揖曾,并記住這些元字符的含義。
元字符: 預(yù)定義好的具有特殊含義的符號亥啦,這些符號能夠進(jìn)行通配炭剪。
可讀性非常差
單引號”; 雙引號””; 反向單引號引用強弱程度比較
https://www.cnblogs.com/wkfvawl/p/9982442.html
grep 正則
https://www.cnblogs.com/songgj/p/8906005.html
https://www.cnblogs.com/lovychen/p/7429682.html
#語法
grep -E 'pattern' filename
cmd | grep -E 'pattern'
#設(shè)置一些環(huán)境變量
echo $GREP_COLORS
grep --color=auto/always -E xxx.txt
cat ~/.bashrc 配置環(huán)境變量就可以不用打命令的時候加選項了
exec $SHELL #設(shè)置bashrc 生效 重新加載shell 相當(dāng)于退出重登
#純普通字符匹配,相當(dāng)于精確匹配
echo "hello world" | grep 'world'
sycn
echo 3 >/proc/sys/vm/drop_caches
grep -E '4574' a.txt #精確
grep -E '[1-9]{4}' a.txt # 非精確搜索
#基礎(chǔ)正則元字符
1 匹配字符:
abc : 匹配字符串 "abc " ,普通字符的匹配
[abcde] : 匹配中括號內(nèi)的任意單個字符
a[xyz]b : 可以匹配 axb ayb 不能匹配 aab abb
#根據(jù)示例 了解匹配過程
[root@master ~]# echo "hello world" | grep -E 'h[abcde]'
hello world #只能匹配到he
[root@master ~]# echo "hello worhd" | grep -E 'h[abcde]'
hello worhd #可以匹配到he hd
1.1 中括號: 匹配的全是括號內(nèi)的單個字符
x[abc]z : xaz xbz xcz
取反:
x[^abc]b : 只要不是中括號中的字符翔脱,都可以匹配
范圍
[a-z] [^a-z]
[A-Z]
[0-9]
[0-59] : 表示匹配[0,1,2,3,4,5,9] 不是0到59
echo "36" | grep -E '[0-59]' #只能匹配到3
echo "a8" | grep -E '[0-59]' # 不能匹配到任何
[a-z0-9A-Z]
[A-z] [a-Z] :建議不要寫這種橫跨大小寫范圍的表達(dá)式奴拦,不同地方范圍表達(dá)的含義不同
有些按照字典順序排序時候,
[a-d] : 不等價于abcd ,而是aBbCcDd
如果想要等價于abcd 需要locale 環(huán)境設(shè)置為C
LC_ALL=C
https://www.cnblogs.com/wajika/p/6592659.html
https://blog.csdn.net/z4213489/article/details/7937894
LC_ALL
它是一個宏届吁,如果該值設(shè)置了错妖,則該值會覆蓋所有LC_*的設(shè)置值绿鸣。注意,LANG的值不受該宏影響暂氯。
"C"是系統(tǒng)默認(rèn)的locale潮模,"POSIX"是"C"的別名。所以當(dāng)我們新安裝完一個系統(tǒng)時痴施,默認(rèn)的locale就是C或POSIX擎厢。
locale 包括(Language), 地域 (Territory) 和字符集(Codeset)
zh_CN.UTF-8,zh代表中文辣吃,CN代表大陸地區(qū)动遭,UTF-8表示字符集
locale的書寫格式為: 語言[_地域[.字符集]]
LC_ALL和LANG優(yōu)先級的關(guān)系: LC_ALL > LC_* >LANG
#中括號如何匹配:
^ 脫字符 :開頭或結(jié)尾
- 范圍 : 開頭或結(jié)尾
] 閉括號 :必須放在開頭 []^] 、 [-^] 齿尽、[]-] 沽损、[]^-]
提示:匹配上面2個或三個
如何在中括號匹配這兩個字符
echo 'abcd-def' | grep '[-abcd]' #放在開頭
echo 'abcd-d^ef' | grep '[^abcd^efda]'
正則表達(dá)式 \w \s \d \b 用法:
. 匹配除換行符以外的任意字符
\n 匹配換行
\t 匹配制表符號
\w 匹配字母或數(shù)字或下劃線 (a-zA-Z0-9_)
\W :匹配非單詞字符 [^a-zA-Z0-9_]
\s 匹配任意的空白符
\d 匹配數(shù)字 等價于[0-9]
\D 匹配非數(shù)字字符
\b 匹配單詞的開始或結(jié)束
^ 匹配字符串的開始
$ 匹配字符串的結(jié)束
. 表示任意單個字符
其中,[^A-Z]表示除了不包含大寫字母循头,^取反;^[A-Z]表示以大寫字母開頭
提示: 有些程序并不支持上面的反斜線轉(zhuǎn)義元字符绵估,例如gnu grep2.6 不支持 \s \d ,grep 2.20支持\s 不支持\d , sed 不支持\d
單詞: 在正則表達(dá)式中的含義卡骂,[^a-zA-Z0-9_]組成的字符或字符串都是單詞 例如 nihao, hello world_ 第一個nihao 第二個hello 第三個world_
示例:
[root@master ~]# echo 'abc def 1234' | grep '\s'
abc def 1234
[root@master ~]# echo 'abc def 1234' | grep '\S'
abc def 1234
[root@master ~]# echo 'abc def 1234' | grep '\w'
abc def 1234
[root@master ~]# echo 'abc def 1234' | grep '\W'
abc def 1234
[root@master ~]# echo 'abc def 1234' | grep '\s\w'
abc def 1234
# . 點匹配任意單個字符
echo "abc def 1234" | grep '.'
echo "abc def 1234" | grep 'a.'
1.2 中括號之字符類
posix 定義好的字符類,請自行查找
還有語言支持非posix 字符類
[:lower:] : 等價a-z
[:alnum:] :代表了0-9A-Za-z 等價 [:lower:]+ [:upper:] +
[:digit:]
使用時:
[[:alpha:]] : 任意字符
echo '1234 helo world 學(xué),U)&)^&' | grep '[12[:alpha:]]
1.3 等價類和排序類 (只做了解)
[=x=] : 普通字符和帶有重音字符(一到四聲音)
[.xyz.] : 排序類 collating symbol
#shell 中輸入制表符
ctrl+v+tab
2 位置匹配(錨定)
只匹配位置国裳,不匹配字符,不會消耗字符數(shù)量全跨,也稱為零寬斷言
^ 匹配行首
$ 匹配行尾
\< 匹配單詞開頭位置
\> 匹配單詞結(jié)尾位置
\b 匹配單詞邊界(開頭和結(jié)尾 \bword\b 等價 \<word\>
\B 非單詞邊界
示例:
echo "abc def 1234" | grep '.\>'
echo "abc def 1234" | grep '\b1234\b'
echo "abc def 1234" | grep '\B234'
#正則表達(dá)式的匹配過程缝左,
------ 消耗字符和交換字符的問題!
----某輪匹配成功浓若,消耗所有匹配成功字符
----某輪匹配失敗渺杉,消耗本輪匹配的首字符,剩余字符被交還
每一論正則的匹配挪钓,都需要從正則的第一個元素從頭開始匹配是越。
# abc "xaabcxyz"
echo "aaaaa" | grep -o 'aa' -o: 匹配過程
一輪匹配
掃描第一個字符 ,和正則表達(dá)式的第一個元素進(jìn)行匹配
如果匹配失敗碌上,這一輪正則匹配失敗
二輪匹配
掃描下一個字符倚评,從頭開始和正則表達(dá)式匹配
如果成功,則繼續(xù)掃描下一個字符和正則的下一個元素匹配
如果這個字符匹配失敗馏予,同一
交換除了第二輪匹配開始的首字符外所有字符
交換知乎天梧,從交換的第一個字符開始進(jìn)入下一輪匹配
第三輪:
如果匹配成功,則不交換匹配成功的字符
然后從匹配成功的下一個字符進(jìn)入下一輪匹配
3 量詞(重復(fù)匹配次數(shù)) 貪婪匹配
基礎(chǔ)正則表達(dá)式中霞丧,對于量詞的元字符需要加上反斜線轉(zhuǎn)義
結(jié)論: 量詞它是正則表達(dá)式中的隱含修飾符呢岗,它修飾的是前面一個字符或前面一個子表達(dá)式,它自身不是正則表達(dá)式中的獨立元素,量詞和它所修飾的字符或子表達(dá)式組合起來才是正則表達(dá)式中的獨立元素敷燎。
{m} 表示匹配前一個字符或前一個子表達(dá)式m 次
{m,n} 最少m次暂筝,最多n次
{m,} 至少m次
{,n} 最多n次 :有些語言不支持(perl 不支持)
注意: 匹配0次也成功,只不過匹配的是空字符硬贯,但是grep 沒法顯示
? :0或1次 等價{0,1} {,1}
* :0或多次 等價于{0,}
提示: .* 匹配任意字符焕襟、任意長度
而不是某個字符任意長度
星號是量詞
".*" : 3 3333 33333 abcdef (也能匹配)
+ :1或多次 等價于 {1,}
示例:
a{3} 匹配a 三次
#echo "aaaaa" | grep -E 'a{3}'
aaaaa
# echo "abc" | grep -E '[abc]{3}'
[root@master ~]# echo "hello world" | grep -Eo '[a-z]{,4}'
hell
o
worl
d
[root@master ~]# echo "hello world" | sed -r 's/[0-9]{,4}/_/g'
_h_e_l_l_o_ _w_o_r_l_d_
#和上一條對比,理解匹配的過程
匹配0次的也是有過程的
思考:量詞會出現(xiàn)大量的回溯饭豹,是正則表達(dá)式的性能殺手
echo "world2222222222" | grep -Eo '[0-9]{100}'
提示:匹配了55次鸵赖,性能問題 : 回溯(回頭匹配)
如果有99個2呢 4950次回書
[root@master ~]# echo "abcdef" | grep -E 'a[b-f]*f'
abcdef
提示 :a 第一個元素 [b-f]* 是第二個元素 f 第三個元素
f 在第二個元素中匹配中交回,匹配了最后一個
[root@master ~]# echo "abcdef" | grep -E 'a[b-c]*f' 無匹配的
提示: 這個* 是和[] 中算一個整體
#實現(xiàn)非貪婪匹配
基礎(chǔ)正則和擴展正則都只支持貪婪匹配拄衰,不支持非貪婪匹配
示例:
[root@master ~]# grep '^m.*:' /etc/passwd
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
mysftp:x:1006:1006::/data/sftp/mysftp:/bin/false
#非貪婪
perl -nE 'say $& if /^m.*?:/' /etc/passwd
[root@master ~]# grep '^m[^:]*:' /etc/passwd
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
mysftp:x:1006:1006::/data/sftp/mysftp:/bin/false