官术网_书友最值得收藏!

1.4.3 正則表達式

在介紹完這些指令的基本功能之后,我們在這里對正則表達式做一個入門的講解。如果你對這一部分不是特別感興趣,可以暫時跳過,這將不會對你的后續學習有任何影響。

為什么要使用正則表達式呢?正則表達式被我們用來匹配一定的文本模式。更具體地說,它可以被用來處理一類特定的文件。舉個比較簡單的例子,你想要處理文件夾下所有的txt文件,那么你可以使用*.txt這樣的表達式來匹配所有的文本文件,使得同時處理大量的文件變成非常簡單的一件事情。

接下來介紹一下基本的語法。鑒于篇幅的限制,不可能做原理上的詳細講解,但會嘗試以一種簡單易懂的方式介紹清楚基本的語法。

正則表達式中的匹配主要依賴于特殊字符,在Linux命令行下的這種正則表達式語法下,.*[]^${}\+?|()被定義為特殊字符。碰到了一個問題,如果想要匹配的文本里本身就包含這些特殊字符怎么辦呢?

答案很簡單,你只需要把這些特殊字符進行轉義,而轉義的工具本身也是特殊字符\。接下來在講解示例的過程中會用到一個命令awk。awk是Linux系統上非常流行的行處理器,它的特點是一行一行地處理數據,然后進行處理化的輸出。

請看一個簡單的示例:

      $ awk '{print $0}' /etc/passwd

這條指令的意思是原封不動地打印/etc/passwd的內容。$0代表整行內容。再看下面的示例:

      $ awk '{print " "}' /etc/passwd

這條指令的意思是打印與/etc/passwd具有相同行數的空行。從這兩條語句的輸出行為可以看出awk按行處理文件的特性。在一行一行獲取到文本內容后,awk提供了很多處理的相關功能,在這里我們就不進行介紹了,因為awk并不是這里講解的重點。

接下來回到正則表達式的講解部分。下面的指令展示了該如何匹配特殊字符:

      $ echo "\ is a special character" | awk '/\\/{print $0}'

在這里我們用\\轉義\符號。這里的//表示awk里的匹配代碼塊,后面這句awk的意思可以理解為輸出匹配成功的所有整行。

因為//也有對應的特殊含義,所以也需要轉義,示例如下:

      $ echo "3 / 2" | awk '/\//{print $0}'

接下來我們講解正則表達式里的其他一些問題。你可能會在實際使用中碰到這樣的情況,一個單詞在句子中多次出現,但你只想匹配那種單詞在開頭出現的模式,那么你需要用到^符號,它匹配的不是文本,而是位置(這在一開始可能難以理解,你需要想清楚這里位置的含義)。舉例來說:

      $ echo "welcome to likegeeks website" | awk '/^likegeeks/{print $0}'

沒有對應的輸出,而

      $ echo "likegeeks website" | awk '/^likegeeks/{print $0}'

輸出likegeeks website。

接下來是匹配的重頭戲“.”符號。“.”符號可以匹配除了空字符串外的所有字符,比如:

      $ cat myfile
      this is a test
      This is another test
      And this is one more
      start with this

$ awk '/.st/{print $0}' myfile

輸出:

      this is a test
      This is another test

如果你不想匹配所有的字符,而僅僅是幾個特定的字符,可使用[]符號,例如:

      $ awk '/[oi]th/{print $0}' myfile

輸出如下:

      this is a test
      This is another test

我們甚至可以反向選擇,排除對應的字符,示例如下:

      $ awk '/[^oi]th/{print $0}' myfile

這樣會排除有o和i出現的情況。

使用-字符可以表示范圍,示例如下:

      $ awk '/[e-p]st/{print $0}' myfile

最后看一看“*”符號。在正則表達式里,它有不太一樣的含義,這一點在使用的時候千萬不要混淆。“*”在bash里有著與剛才“.”類似的含義,但可以匹配多個字符;而在正則表達式里,它并不匹配字符,而是表示一個模式可以重復多次或零次。

      $ echo "st" | awk '/s[ae]*t/{print $0}'

輸出st。

      $ echo "awwwwwk" | awk '/aw*k/{print $0}'

輸出awwwwwk。

主站蜘蛛池模板: 江源县| 东源县| 织金县| 长岛县| 黔西县| 蓬溪县| 什邡市| 西吉县| 昌宁县| 大英县| 泗水县| 舟山市| 涿州市| 安泽县| 沙雅县| 芦山县| 蕲春县| 阿拉善盟| 五家渠市| 嘉祥县| 印江| 克东县| 阿克苏市| 商丘市| 苗栗县| 新乡县| 绿春县| 原平市| 鄢陵县| 江永县| 汉沽区| 台州市| 抚州市| 岑巩县| 沈阳市| 永修县| 依兰县| 南靖县| 上杭县| 马鞍山市| 孟州市|