Shell 中的 正則表示式
阿新 • • 發佈:2019-02-17
常接觸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\{2,\}' test.txt // {} 需要跳脫字元轉義 所以在前面加上 \
也是修飾前一個字元的,這裡代表找以js開頭後面緊接著2個以上s 的一行,\{2,6\} 就代表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 的一些高階用法~