1. 程式人生 > >Shell 中的 正則表示式

Shell 中的 正則表示式

    常接觸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 的一些高階用法~