詳解正則表達式以及文本處理工具—grep、egrep的用法和特性

一、grep

(1)grep簡介

grep:全稱是Global search REgular expression and Print out the line,全局搜索正則表達式並輸出合適的行。

grep是一種強大的文本搜索工具,根據用戶指定的文本模式(搜索條件)對目標文件進行逐行搜索,顯示能匹配到的行。(只對文本進行搜索處理)

Unix的grep家族包含grep、egrep和fgrep。

(2)grep的用法

語法格式:grep [option]... 'PATTERN' FILE...

                     選項       文本模式     文件

   命令選項:

  --color=auto :自動標記顏色(對匹配到的字符串標記顏色,默認是紅色)

  -v: 反向選取(只顯示沒有被匹配到的行)

  -o: 僅顯示匹配的字串,而非字串所在的行

  -i: (ignore-case)忽略字符大小寫

  -A # :顯示匹配到的行和該行的後#行 (#表示數字)

  -B # :顯示匹配到的行和該行的前#行

  -C # :顯示匹配到的行、該行的前#行和該行的後#行

  -E: 支持使用擴展正則表達式(相當於使用egrep命令)

grep不是拿整行匹配的,是按字串匹配的。(當在一行中第一次匹配到指定的字符串時,它不會直接跳到下一行再去匹配,而是在本行繼續往後匹配。)

grep工作於貪婪模式:儘可能多的去匹配

wps_clip_image-23823

要想使用grep的高級用法,須結合正則表達式和管道一起使用。因此,接下來讓我們撥開迷霧,走進正則表達式的花園。

二、正則表達式簡介

正則表達式:

   正則表達式,又稱正規表示法、常規表示法(英語:Regular Expression,在代碼中常簡寫爲regex、regexp或RE),計算機科學的一個概念。

   正則表達式使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。在很多文本編輯器裏,正則表達式通常被用來檢索、替換那些符合某個模式的文本。

           其實正則表達式就是一類字符所書寫的模式,其中許多字符不表示其字面意義,而是表達控制或通配等功能;

元字符:

   正則表達式中具有特殊意義的專用字符(類似於C語言中的關鍵字);

  不表示其字面意義,而用於額外功能性描述

分類:

     正則表達式分爲兩類: “基本正則表達式”和“擴展正則表達式”

     grep內置“基本正則表達式”的功能,也可以使用grep -E 利用“擴展正則表達式”的功能。

     egrep內置“擴展正則表達式”的功能。

     fgrep: 不支持使用正則表達式

三、基本正則表達式

基本正則表達式的元字符:

(1)字符匹配:

.: 匹配任意單個字符

wps_clip_image-29481

[]: 匹配指定範圍內的任意單個字符

      [0-9], [[:digit:]]  (單個0-9的數字)

              [a-z], [[:lower:]]  (單個小寫字母)

              [A-Z], [[:upper:]]  (單個大寫字母)

              [[:space:]]  (空格)

              [[:punct:]]  (單個標點符號)

              [[:alpha:]]  (單個字母,包括大小寫)

                   wps_clip_image-29639

     [[:alnum:]] (單個數字或字母)

[^]:匹配指定範圍內外的任意單個字符

(2)次數匹配元字符:用於實現指定其前面的字符所能夠出現的次數

    *: 任意長度,它前面的字符可以出現任意次

    \?: 0次或1次,它前面的字符是可有可無的

    \{m\}: m次,它前面的字符要出現m次

    \{m,n\}: 至少m次,至多n次(m<n)

    \{m,\}:至少m次

    \{0,n\}: 至多n次

    .*:任意長度的任意字符

  wps_clip_image-24154

(3)位置錨定:

   ^: 行首錨定;寫在模式最左側

   $: 行尾錨定:寫在模式最右側

          ^$: 空白行

          wps_clip_image-31177(查找有空白行的,有才會顯示)

\<: 錨定詞首,出現於單詞左側,也可用\b

  \>: 錨定詞尾,出現於單詞右側, 也可用\b

(不包含特殊字符的連續字符組成的串叫單詞)

(4)分組:

\(\) :分組的格式

       wps_clip_image-29876

分組中的模式匹配到的內容,可由正則表達式引擎記憶在內存中,之後可被引用。

引用有編號:自左而後的左括號,以及與其匹配右括號(不管內嵌多少個括號,都是從左到右編號的。)

     例如,\(a\(b\(c\)\)mn\(x\)\).*\1  (\1引用的是第一個左括號以及與其匹配右括號間匹配的內容)

\#: 引用第n個括號所匹配到的內容,而非模式本身(#表示數字)(如,\(ab\(x\).*\2 : \2引用的是\(x\)的匹配內容)

    例如:

       \(ab\?c\).*\1

      abcmnaaa        abcmnabc(匹配成功)  abcmnac        acxyac(匹配成功)

四、擴展正則表達式

egrep內置“擴展正則表達式”的功能,也可使用grep -E 利用“擴展正則表達式”的功能。

         grep -E  'PATTERN' FILE...

        egrep 'PATTERN' FILE...

(1)字符匹配:

   . :匹配單個任意字符

   [] :匹配指定範圍內的任意單個字符

  [^] :匹配指定範圍外的任意單個字符

(2)次數匹配:

  *:任意次

  ?: 0次或1次(可有可無)

  +: 至少1次;(相當於基本正則表達式的\{1,\})

{m}: 精確匹配m次

{m,n}: 至少m次,至多n次(m<n)

{m,} : 至少m次

{0,n} :至多n次

(3)位置錨定:

^ :行首錨定

$ :行尾錨定

\<, \b :詞首錨定

\>, \b :詞尾錨定

^$, ^[[:space:]]*$ :空白行

(4)分組:

() :

同樣可使用引用:\1, \2, \3

| :或者(擴展正則表達式特有的)

   例如:a|b表示a或者b

          conC|cat :表示conC或cat

          con(C|c)cat :表示conCat 或 concat

                 wps_clip_image-16443

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章