grep是個什么鬼

正則表達式

  一個正則表達式是一個描述了一個字符串集合的模式。正則表達式的構造類似于算術表達式,使用各種各樣的操作符來將更小的表達式連在一起。

Grep能理解兩種不同版本的正則表達式語法:“basic”和“extended”。在GNU grep中,兩種語法可以實現的功能是沒有區別的。在其他實現中,基本(basic)正則表達式表達能力要弱一點。下面的描述適用于擴展的(extended)正則表達式,它與基本正則表達式的區別會在最后做一個總結。

基本的構造塊是匹配單個字符的正則表達式。大部分字符,包括所有字母和數字,是匹配它們自身的正則表達式。任何具有特殊含義的元字符可以通過前置一個反斜杠來引用。

1元字符

方括號表達式(bracket)是一個字符序列,放在 [ ] 當中。它匹配序列中的任何一個字符;如果序列中的第一個字符是脫字符(caret) ^ 那么它匹配不在序列中的任何一個字符。例如,正則表達式 [0123456789] 匹配任何一個數字。

在方括號表達式之中,一個范圍表達式(range)由兩個字符組成,中間用一個連字符    (hyphen)分隔。它匹配在這兩個字符之間的任何一個字符,使用本地化的序列順序和字符集。(that sorts between the two characters,inclusive, using the locale’s  collating sequence and character set.)  例如,在默認的  C locale中,[a-d][abcd]等價。

許多 locale 將字符以字典順序排序,在這些 locale 中,[a-d]不與[abcd]等價;例如它可能與[aBbCcDd]等價。

  最后,在方括號表達式中有一些預定義 的字符類,如下所示。它們的名字是自說明的,它們是[:alnum:](字母和數字), [:alpha:](字母), [:cntrl:](控制字符), [:digit:](數字), [:graph:](圖形字符), [:lower:](小寫字母),[:print:](可打印字符),[:punct:](標點符號),[:space:](空格),[:upper:](大寫字母),[:xdigit:](十六進制數字)

[:alnum:]

字母和數字

[:cntrl:]

控制字符

[:alpha:]

字母

[:print:]

可打印字符

[:lower:]

小寫字母

[:punct:]

標點符號

[:upper:]

大寫字母

[:space:]

空格

[:digit:]

數字

[:graph:]

圖形字符

[:xdigit:]

十六進制數字

例如, [[:alnum:]] 意思是[0-9A-Za-z],但是后一種表示方法依賴于  locale CASCII字符編碼,而前一種是與locale和字符集無關的。(注意這些字符類名中的方括號也是符號名稱的一部分,必須包含在用來為序列定界的方括號之中。)

  大多數元字符處于序列中時會失去它們的特殊意義。為了包含一個字面意義(literal)的 ,需要將它放在序列的最前。與此相似,為了包含一個字面意義(literal)^,需要將它放在除了序列最前之外的其他位置。最后,為了包含一個字面意義(literal), 需要將它放在序列最后。

   句點符(period)  .  匹配任何一個字符。符號\w[[:alnum:]]的同義詞,\W[^[:alnum]]的同義詞。

   脫字符(caret)^和美元標記(dollar)$分別是匹配一行的首部和尾部的空字串的元字符。

   符號\<\>分別是匹配一個詞的首部和尾部的空字串的元字符。

   符號\b匹配一個詞邊緣(edge)的空字串,符號\B匹配不處于一個詞的邊緣的空字串。

2重復操作符

  一個正則表達式后面可以跟隨多種重復操作符之一。

   ? 前的項是可選的,最多匹配一次。

   * 前的項可以匹配零次或多次。

   + 前的項可以匹配一次或多次。

   {n} 前的項將匹配恰好n次。

   {n,} 前的項可以匹配n或更多次。

   {n,m} 前的項將匹配至少n詞,但是不會超過m次。

  兩個正則表達式可以連接到一起;得出的正則表達式可以匹配任何由兩個分別匹配連接前的子表達式的子字符串連接而成的字符串。兩個正則表達式可以用中綴操作符|將它們聯合到一起,得出的正則表達式可以匹配任何匹配聯合前的任何一個子表達式的字符串。

 重復操作符的優先級比連接高,接下來又比選擇的優先級高。一個完整的子表達式可以用圓括號(parentheses)括住來超越這些優先級規則。反向引用 \n 中, n 是一個數字,匹配正則表達式中,以第 n 個圓括號括住的子表達式已匹配的子字符串。

在基本正則表達式中,元字符  ?,  +,  {, |, (, ) 喪失了它們的特殊意義;作為替代,使用加反斜杠的 (back]2slash) 版本 \?, \+, \{, \|, \(, \) 。

  傳統的 egrep 不支持元字符 { ,并且一些 egrep 的實現通過支持  \{  來代替它,因此可移植的腳本應當避免在egrep 中使用 { 模式,應當使用 [{] 來匹配一個字面意義 (literal) { (上面提到大部分元字符放入方括號中會失去特殊意義)。

  

原創文章,作者:TQT,如若轉載,請注明出處:http://www.www58058.com/73566

(0)
TQTTQT
上一篇 2017-04-17
下一篇 2017-04-17

相關推薦

  • 千萬不要把 bool 設計成函數參數

    我們有很多Coding Style 或 代碼規范。但這一條可能會經常被我們所遺忘,就是我們經常會在函數的參數里使用bool參數,這會大大地降低代碼的可讀性。不信?我們先來看看下面的代碼。 當你讀到下面的代碼,你會覺得這個代碼是什么意思? widget->repaint(false); 是不要repaint嗎?還是別的什么意思?看了文檔后,我們才知道這個…

    Linux干貨 2016-07-10
  • 命令組合

    1 取出當前已登陸的用戶名 2 取出最后登錄用戶的相關信息 3 取出默認shell最多的的類型   4 轉移    [redsun@jiange root]$ sort -t: -k3 -n -r  /etc/passwd | sed -n "1,+3p" | tr 'a-z' …

    Linux干貨 2016-11-13
  • LInux系統啟動與內核管理(下)

    從上一篇介紹了系統啟動流程可以得知,在BIOS讀取相關信息之后,接下來就是去找第一個可以啟動的設備當中的MBR中讀取Boot Loader信息,Boot Loader提供具有慘淡功能,直接加載內核信息,以及相關的控制權轉交功能。啟動系統必須有Boot Loader,然后才能去加載內核,Boot Loader存儲于MBR當中,MBR只有512字節,其中前446…

    Linux干貨 2016-09-19
  • OpenStack之keystone

    一、什么是OpenStack    OpenStack是一種云操作系統,它控制著一個數據中心里大量的計算、存儲和網絡資源。管理員在一個web界面內通過儀表盤方便地管理,控制,授權用戶,以提供各種資源。 二、云服務分類 可分為IAAS, PAAS, SAAS等 IAAS:Infrastructure as a Service (操作系統級別…

    Linux干貨 2017-01-19
  • 第二章 linux高級命令的簡單使用以及shell腳本的簡單制作

    重定向;正則表達式;grep;sed;vim;yum;shell腳本

    Linux干貨 2018-03-17
  • Linux的終端類型

    1、串行端口終端(/dev/ttySn):       串行端口終端(Serial Port Terminal)是使用計算機串行端口連接的終端設備。計算機把每個串行端口都看作是一個字符設備。有段時間這些串行端口設備通常被稱為終端設備,因為那時它的最大用途就是用來連接終端。這些串行端口所對應的設備名稱是/dev…

    Linux干貨 2016-10-14

評論列表(1條)

  • renjin
    renjin 2017-04-21 11:09

    主要介紹了grep命令中的正則表達式的用法 ,內容介紹的很詳細,可以適當的加幾個示例進來

欧美性久久久久