常接觸shell指令碼語言的,經常會看到乙個shell命令接一堆亂七八糟的option,類似這樣的sed -e "s/^[^\-]*-//",雖然知道那肯定是乙個邏輯條件組合,但是如果不是熟悉正規表示式的人,絕對看的眼花.
這裡學習記錄一下正規表示式的一些基本用法.
正規表示式也叫正規表示法,就是處理字串的方法,他是以行為單位進行字串癿處理行為, 正則表示法透過一些特殊符號的輔助,
可以讓使用者輕易的達到搜尋 刪除 取代』某特定字串的處理程式!
以grep摘取命令為例
grep -n 『jscese』 test.txt
以單引號包含需要搜尋的字串,
單雙引號的區別在於,單引號裡面的內容全當字元處理,如果裡面是其它變數名,也只當作普通字元,二雙引號就不同,具有引用特性
grep -n 'j[sc]ese' test.txt
中括號代表乙個字元, 所以上面的語句代表會 搜尋 jsese jcese 這兩種組合可能.
grep -n 『j[^s]cese' test.txt //取中間不是 s 的
grep -n 'j[^a-za-z0-9]cese test.txt //取中間不是a-z a-z 0-9 的,只有是特殊符號的才行了
grep -n '^jscese' test.txt //代表開頭 ,取以jscese開頭的行
使用 ^ 在中括號 裡面和外面代表的意義是不一樣的,在裡面代表取反,在外面代表行首!
grep -v '^$' test.txt //取非空的行
行首^直接加行尾$,代表空的一行,-v 就是取非匹配的
grep -n 'j....e' test.txt // 其中每個 . 代表任意的乙個字元
grep -n 『j*』 test.txt // 這個會列出所有的 ,因為 * 代表重複前面的字元 0 次 或者 無數 次, 也就是可能是空
修飾前乙個字元
grep -n 『js\' test.txt // {} 需要跳脫字元轉義 所以在前面加上 \
也是修飾前乙個字元的,這裡代表找以js開頭後面緊接著2個以上s的一行,\ 就代表2到6個之間的都符合
基本的規則就是上面的這些了,詳細的可以去看鳥哥的私房菜,現在來看看開頭的sed -e "s/^[^\-]*-//"
這個是在envsetup,sh 中用來取原始碼編譯型別的,lunch選取的值為selection= full_x86-eng的樣式
通過:
local variant=$(echo -n $selection | sed -e "s/^[^\-]*-//")
可以看到 通過sed命令直接進行編輯,利用sed的s取代動作,後面的模式為:
「s/要被取代的部分/取代的字串/「
可以看到 要被取代的部分為 :^[^\-]*-這代表從頭開始,0個或者多個 非 - 的字元然後以 - 字元結尾的部分, 因為在中 - 具有範圍的意義,所以加了跳脫字元 \
取代部分這裡是空的
所以最後實際上是把 full-x86- 給剔除掉了,餘下eng 賦值給 variant ,這就是工程機的編譯模式.
到這裡正規表示式的入門基本算是完成了,後面有機會分析sed 以及awk 的一些高階用法~
Shell中的正規表示式
1 什麼是正規表示式 1.乙個字符集.這裡的字符集裡的字元表示的就是它們字面上的意思.正規表示式最簡單的情況就是僅僅由字符集組成,而沒有其他的元字元.2.錨.乙個錨指明了正規表示式在一行文字中要匹配的位置,例如 和 就是錨.3.修飾符 它們用於展開或縮小 即是修改了 正規表示式匹配文字行的範圍.修飾...
Shell中的正規表示式
hel o helo hello hellllllo.aa.表示前三個字元可以為任意 第四個和四五個字元要為a 第六個字元可以為任意 任意字元可以是乙個空格 hello 表示匹配以hello開頭的行 roo 表示行首的前三個字元為任意字元 第四到六的字元為roo 第七個字元開始可以重複匹配hello...
shell正規表示式
句點 匹配單字元 1 匹配任意單ascii 字元,可以為字母,或為數字。2 舉例 xc.匹配dexc1t 23xcdf 等,w.w.w.匹配rwxrw rw 行首以 匹配字串或字串行 1 允許在一行的開始匹配字元或單詞。2 舉例 01 匹配0011cx4 c01sdf 等,d 匹配drwxr xr ...