【轉】sed & awk經常使用正則表達式

正則表達式元字符

正則表達式中有兩種基本元素:git

  1. 以字面值或變量表示的值(如.表明任意單個字符)。
  2. 操做符(如*表明將前面的字符重複任意次)。

元字符彙總正則表達式

特殊字符spa

用途ip

.字符串

匹配除換行符之外的任意單個字符。在awk中,句點也能匹配換行符。it

*table

匹配任意一個(包括零個)在它面前的字符(包括由正則表達式指定的字符)awk

[…]變量

匹配方括號中的字符類中的任意一個。若是方括號中第一個字符爲脫字符號(^),則表示否認匹配,即匹配出了換行符和類中列出的哪些字符之外的全部字符。在awk中,也匹配換行符。連字符(-)用於表示字符的範圍。若是類中的第一個字符爲右方括號(])則表示它是類的成員。全部其餘的元字符在被指定爲類中成員時都會失去它們原來的含義。擴展

^

若是做爲正則表達式的第一個字符,則表示匹配行的開始。在awk中匹配字符串的開始,即便字符串包含嵌入的換行符。

$

若是做爲正則表達式的最後一個字符,則表示匹配行的結尾。在awk中匹配字符串的結尾,即便字符串包含嵌入的換行符。

\{n,m\}

匹配它前面某個範圍內單個字符出現的次數(包括由正則表達式指定的字符)。\{n,m\}將匹配n次出現,\{n,\}至少匹配n次出現,並且\{n,m\}匹配n和m之間的任意次出現。

\

轉意隨後的特殊字符。

+

匹配前面的正則表達式的一次或屢次出現。

?

匹配前面的正則表達式的零次或一次出現。

|

指定能夠匹配其前面的或後面的正則表達式。

()

對正則表達式分組

{n,m}

匹配它前面某個範圍內單個字符出現的次數(包括由正則表達式指定的字符)。{n}表示匹配n次出現,{n,}表示至少匹配n次出現,{n,m}匹配n和m之間的任意次出現。

廣泛存在的反斜槓

元字符反斜槓(/)將元字符轉換成普通字符(或將普通字符轉換成元字符)。它強制將任意元字符解釋爲普通字符,一邊匹配該字符自己。

在sed中,使用反斜槓將一組普通字符轉意爲元字符。

如 \(\) \{\} \n

字符類

字符類是對通配符概念的改進。咱們能夠列出要匹配的字符,而不是匹配特殊位置的任意字符。使用方括號元字符([])將字符列表括起來,其中每一個字符佔據一個位置。

注意:在方括號中元字符會失去它們的含義。

如[Ww]hat能夠匹配what或者What

字符類中的的特殊字符:

字符

功能

\

轉義任意特殊字符(只用於awk中)

-

當它再也不第一個或最後一個位置時,表示一個範圍。

^

僅當在第一個位置時表示反轉匹配。

反斜槓只在awk中是特殊的,所以可使用字符類"[a\]1]"以匹配一個a、一個]或一個1。

 

若是閉括號(])是做爲類中的第一個字符出現(或者是脫字符後的第一個字符),那麼它就被解釋爲類的一個成員。若是連字符在一個類中是第一個或最後一個字符,則失去其特殊含義。所以,爲了匹配算術操做符,咱們在下面的實例中將連字符(-)放在第一位:

        [-+*/]

使用正則表達式匹配下面的日期,該日期可能有下面兩種格式:

MM-DD-YY

MM/DD/YY

下面的正則表達式指示每一個字符位置可能的樹枝範圍:

        [0-9][0-9][-/][0-3][0-9][-/][0-9][0-9]

"-"或"/"均可能是定界符。在第一個位置防止連字符確保它在字符類中解釋爲字面意義,即做爲一個連字符,而不是指示一個範圍。

排除字符類

一般,字符類包括在哪一個位置想要匹配的全部字符。在類中做爲第一個字符的脫字符(^)將類中全部字符都排除在被匹配以外。相反,除換行符之外沒有在列的方括號中的任意字符都將被匹配。

下面的模式將匹配任意非數字字符:

    [^0-9]

它匹配字面表中全部的大寫和小寫字面以及全部特殊字符,例如標點符號。

POSIX字符類補充

POSIX標準對正則表達式字符和操做符的含義進行了形式化。這種標準定義了兩類正則表達式:基本的正則表達式(BRE),grep和sed使用這種正則表達式;擴展的正則表達式,egrep和awk使用這種正則表達式。

POSIX還改變了經常使用的屬於,咱們一直成爲"字符類"的東西在POSIX標準中成爲"括號表達式"。在括號表達式中,出了字面字符(例如a, !等)之外,還能夠由其餘標記。如:

  • 字符類。由[::]包圍的關鍵字組成的POSIX字符類。關鍵字描述了不一樣的字符類,如文字字符類,控制字符等等。
  • 整理複合。整理複合是多字符的序列。表示這些字符應該被看做是一個單元,它由[,.]包圍的字符組成。
  • 等價類。等價類列出了應該看做是等價的字符集,它由地區化的字符元素(有[==]包圍)組成。

全部這3種結果都必須出如今括號表達式的方括號中。例如[[:alpha:]!]匹配任意單個字幕字符或感嘆號,[[.ch.]]匹配整理元素ch,但不止匹配字幕c或字幕h。

POSIX字符類:

[:alnum:]

可打印的字符(包括空白字符)

[:alpha:]

字母字符

[:blank:]

空格和製表符

[:cntrl:]

控制字符

[:digit:]

數字字符

[:graph:]

可打印和可見的(非空格)字符

[:lower:]

小寫字符

[:print:]

可打印的字符(包括空包字符)

[:punct:]

標點符號字符

[:space:]

空白字符

[:upper:]

大寫字符

[:xdigit:]

十六進制數字

定位元字符

有兩個元字符用於指定字符串出如今行首或行末的上下文。脫字符^表示行開始,$表示行結束。

可使用兩個聯繫的定位元字符來匹配空行,即:

    ^$

可使用這種模式計算文件中的空行數,在grep中使用計數選項-c:

    # grep –c '^$' ch04

    5

若是想使用sed來刪除空行,那麼這個正則表達式頗有用。下面的正則表達式能夠用於匹配空行,即便其中包含空格:

    ^*$

一樣,可使用如下表達式匹配整個行:

    ^.*$

在sed(和grep)中,只有當"^"和"$"分別出如今正則表達式的開始或結尾纔是特殊的。所以"^abc" 意味着 "匹配只處於行開始處的字母a、b和c",而"ab^c"覺得着"匹配處於行的任意位置的a、b、字面意義的^,而後是c"。這對於"$"一樣適用。

 

在awk中則不一樣,"^"和"$"老是特殊的,即便它們可能使編寫的正則表達式不匹配任何東西。能夠說,在awk中,當想要匹配字面"^"或"$"時,無論它處於正則表達式的什麼位置都應該使用反斜槓對其進行轉義。

字符的跨度

在grep和sed中使用\{和\}。POSIX egrep 和 POSIX awk使用{和}。在任何狀況下,大括號包圍一個或兩個參數。

    \{n,m\}

n和m是0到255之間的整數。若是隻指定\{n\}自己,那麼將精確匹配前面的字符或正則表達式的n次出現。若是指定\{n,m\},那麼就匹配出現的次數爲n和m之間的任意次數。

選擇性操做

豎線(|)元字符是元字符擴展集的一部分,用於指定正則表達式的聯合。若是某行匹配其中的一個正則表達式,那麼它就匹配該模式。

分組操做

圓括號()用於對正則表達式進行分組並設置優先級。它們是元字符擴展集的一部分。假設在文本文件中將公司的名稱爲"BigOne"或"BigOneComputer",使用正則表達式:

    BigOne(Computer)?

將匹配字符串"BigOne"自己或者後面跟有一個字符串"Computer"的形式。一樣,有些屬於有時會用全拼,有時會用縮寫、則可使用:

    # egrep "Lab(oratorie)?s" mail.list

    Bell Laboratories, Lucent Technologies

    Bell Labs

能夠用豎線和圓括號來對選擇性操做進行分組。在下面的示例中,使用它來指定單詞"company"的單數或複數匹配。

    compan(y|ies)

注意:大多數sed和grep 的版本中不能對加圓括號的一組字符應用數量詞,可是在egrep和awk的全部版本都是能夠的。

限制範圍

一個正則表達式爲:

    A.*Z

匹配的結果爲

All of us, including Zippy, our dog

All of us, including Zippy and Ziggy

All of us, including Zippy and Ziggy and Zelda

下劃線的字符串表示匹配的字符串,即.*在每種狀況下都會匹配可能的最長的範圍。

 

正則表達式嘗試匹配最長的字符串,這可能會引發意想不到的問題。例如,下面的正則表達式與引號中的任意個字符匹配:

    ".*"

輸入字符串爲:

    .Se "Appendix" "Full Progarm Listings."

要匹配第一個參數,能夠用下面的正則表達式來描述:

    \.Se ".*"

然而,由於模式中的第二個引號與該行上的最後一個引號匹配,因此它結束匹配整個行。若是知道參數的個數,那麼能夠對每一個進行說明:

    \.Se ".*" ".*"

雖然這種方法能夠像指望的那樣工做,可是每行也許不會有相同書目的參數,省略你只想要第一個參數。這裏有一個匹配兩個引號之間最短範圍的正則表達式:

    "[^ "]*"

它匹配引號而且後面跟有任意個字符的狀況,但它不匹配引號後面跟有引號的狀況。

其餘一些正則

國家的縮寫

□[A-Z][A-Z]□

HTML代碼

<[^ >]*>

匹配空行

^$

匹配整行

^.*$

匹配一個或多個空格(空內容的行)

□□*

相關文章
相關標籤/搜索