一、簡介
Shell中很多工具和命令普遍使用到了Regex,瞭解基本的Regex和擴充Regex中元字元的意義和用法對熟練使用Shell編程很有好處。
RegexRE(Regular Expression)是由一串字元和元字元構成的字串,主要功能是文字查詢和字串操作,它可以匹配文本的一個字元或字元集合。用於資料流處理完成資料過濾 。
二、詳解
POSIX分為基本的Regex和擴充的Regex,linux都支援基本的Regex。
1、基本Regex
(1)Regex的基本元素包括一般字元和元字元,如a、b、1等屬於一般字元。而*、^、[]等元字元賦予了特殊的意義。
(2)方括弧[]匹配字元集合,可以使用"-"表示字元集合範圍(從"-"左邊字元開始到"-"右邊字元結束)。linux系統大小寫敏感並且支援字母排序。
(3)"^"符號表示匹配行首,但“^”符號放到"[]"中就不再表示匹配行首了而是取反符號,例[^b-d]表示不在b~d範圍內的所有字元(即包括其他字母、數字、空格等)。[A-Za-z][A-Za-z]*匹配任意英文單詞。
(4)"\<\>"符號是精確匹配符號,如\<the\>精確匹配the單詞,不匹配包括the字元的單詞如them、there。
(5)"\{\}"系列符號可以指定重複次數("*"符號只能表示重複0次或任意次)。
2、擴充Regex awk和perl等linux工具還支援Regex擴充出來的一些元字元。
(1)"?"至多可以匹配1個字元。"+"至少匹配一次。"*"可以匹配0次和多次。
(2)"("通常與"|"結合表示一組可選字元的集合。但"()"符號很少使用,因為"[]"完全能夠代替"()"表示一組可選字元的集合。re(a|e|o)d就等價於re[aeo]d。
3、通配 (1)Bash shell本身不支援Regex,使用Regex的是Shell命令和工具如gerp、sed、awk等。但shell可以使用Regex中的一些元字元實現通配功能,最常用的萬用字元包括Regex元字元:?、*、[]、{}、^等,它們的意思和Regex中的意義不完全一致。
*符號不再表示其前面的字元的重複,而是表示任意位的任一字元。?字元表示一個任一字元。^符號在通配中不代表行首,而是代表取反。
(2)ls列出以a~h開頭且不是以.txt結尾的檔案,通配為[a-h]*.[^txt]*。"^"表示取反,"[]"符號的意義與Regex中的意義一樣。
(3)Regex中只有在花括弧前加上轉義符的用法,即\{\}用於限制匹配字元的個數;而通配中{}符號表示一組運算式的集合例如{[a-h]*.txt, a?.log}表示滿足[a-h]*.txt或a?.log的所有檔案,{}內的運算式是或的關係。
(4)內部變數GLOBIGNORE儲存了通配時所忽略的檔案名稱集合,?、*、[]、{}、^五個符號和GLOBIGNORE變數構成了shell通配的所有內容。
(5)通配需搜尋大量的檔案或目錄進行匹配而輸出,對cpu和記憶體要求較高,駭客輸入包含萬用字元的檔案名稱故意讓伺服器重複和連續不斷地進行通配可能引起拒絕服務的攻擊,因此伺服器都限制執行通配功能的次數、限制一個使用者每次輸入的萬用字元。
三、總結
(1)Shell不支援Regex,其萬用字元與Regex中符號意義不完全一致。
(2)僅簡單的介紹shell編程,其他更多的內容以後的開發中再詳解。