1. 程式人生 > >《Linux Shell》筆記之正則表示式

《Linux Shell》筆記之正則表示式

  1. 正則表示式概念 

正則表示式的文法分為3種標準:BRE、ERE 和 ARE。其中 BER 和 ERE 屬於 POSIX 標準,ARE 則是由各家定義的擴充套件

BRE:基本正則表示式

ERE:在BRE基礎上,擴充套件正則表示式

什麼是POSIX呢,POSIX Portable Operating System Interface 可移植作業系統介面,  (BRE, ERE)的應用。

正則表示式的基本字元匹配:特殊字元(meta character 元字元)和一般字元。

什麼是元字元:特殊意義的專用字元(如"*","+","?","."等),用一個或者一組元字元代替一個或多個字元。舉個例子: 元字元*用來匹配0個或多個的前一字元;而元字元. 用來匹配一個任意的一個字元

什麼是一般字元:原義正常文字字元(非元字元),例如:'*grep' 匹配所有一個或多個任意字元後緊跟grep,grep就是一般字元。

  1. 常見linux命令及他們預設使用的正則表示式型別

       grep

        sed

           vi

    egrep

       awk

BRE

*

*

*

ERE

*

*

  • grep: 加上-E,開啟ERE模式
  1. BRE和ERE 都支援的元字元

字元

BRE/ERE

模式含義

^

BRE,ERE

行或字串的開始;如:'^abcd' 匹配所有以abcd開頭的行

$

BRE,ERE

行或字串的結束,如:'abcd$' 匹配以abcd結尾的行

.

BRE,ERE

匹配一個非換行符的字元 (1);

如:'a.b' 匹配a後接一個任意字元,然後是b,將匹配 aAb, a1b, acb, [email protected]

如: '.b' 匹配 ab,1b,@b …等

*

BRE,ERE

匹配零個或多個正則表示式前面的字元 (0-n)

如:'ac*d' 匹配a後接零個或多個前面的字元,將匹配:ad, acd, accd, acccd …等

注意:星號不能放在首位, 星號前面必須有單個字元,經常我們使用 .*表示任意數目字元,但不能直接把星號放在首位如 '*d'

[…]

BRE,ERE

匹配方括號內任意一個字元(1);

如:"[Ab]cde" 匹配Abcd和abcd


連字元(-) 表示連續字元的範圍;

如:"[0-9]abc"匹配abc前面的任意一個數字:0abc, 1abc, 2abc, 012abcd, 0123abcd ……

[a-z] 123 匹配123前面的任意一個小寫母如:a123, b123, ab123, abc123

[A-Z] 123 匹配123前面的任意一個大寫母如:A123, B123, AB123, ABC123

[a-zA-Z0-9]表示匹配任意一個數字和大小寫英文字母;

[a-bA-Z0-9!]表示所有的大小寫字母,數字和感嘆號;

其它的形式有:[A-Z],[AB-Z],[A-YZ],[AB-YZ],[A-DE-Z]

不支援形式有:[A-D-Z],[AB-D-Z],[A-D-YZ]

如果^符號位於方括號的開始,則具有相反含義:不匹配方括號中的任意字元。

如:'[^A-FH-Z]rep' 匹配不包含A-R和T-Z的一個字母開頭,緊跟rep的行;或者[^A-Z]rep

\

BRE,ERE

通常用於關閉其後續字元的特殊意義,恢復其原意。

如:\(...\),這裡的括號僅僅表示括號。


4. BRE ERE支援不同的元字元

字元

BRE

模式含義

\(\)

BRE

將圓括號之間的模式儲存在特殊“保留空間”。最多可以將9個獨立的子模式儲存在單個模式中。匹配於子模式的文字,可以通過轉義序列\1到\9,被重複使用在相同模式裡。

如'\(abc\).*\1' 匹配兩個abc中間帶有任意數目的字元,第二個abc使用\1來引用。最多可以儲存9個獨立的模式,即從\1到\9;  簡單說:將abc放在保留空間,使用\1引用abc;

注意:必須使用 .*

\(ab\).*\1 匹配: abab,ab1ab1, ab12ab1, ab123ab1….等

\(ab\).*\1.*\(de\).*\2 匹配ab1ab1def1de1, ab12ab12de12de1….等

\n

BRE

重複在\內的第n個模式。n為1到9,n是數字. 

x\{m, n\}

BRE

匹配x字元出現的次數區間。x\{n\}是指x出現n次;x\{m,\}是指x出現至少m次;x\{m,n\}指x至少出現m次,至多出現n次. 

如:ab\{2\}匹配abb;ab\{2,\}表示abb、abbb等。ab\{2,4\}表示abb、abbb和abbbb。

x{m, n}

ERE

其功能等同於上面的\{n,m\},只是不再寫\轉義符了。

匹配x字元出現的次數區間。x\{n\}是指x出現n次;x\{m,\}是指x出現至少m次;x\{m,n\}指x至少出現m次,至多出現n次. 

m表示最小值,n表示最大值

如:ab{2}匹配abb;ab{2,}表示abb、abbb等。ab{2,4}表示abb、abbb和abbbb。

+

ERE

與*相比,匹配前面正則表示式的一個或多個例項 (1-n)

如:ab+c 匹配abc,abbc,abbbc ….等

?

ERE

匹配前面正則表示式的零個或一個例項 (0-1)

如:ab?c 匹配ac, abc

|

ERE

匹配|前面或後面的正則表示式

如:'ab|cd'匹配ab, cd, abcd

()

ERE

匹配用括號括起來的正則表示式群; 如:參見11的分組例子

  1. grep 程式支援的元字元plus

字元

模式含義

\<

單詞的開始,如:'\<ab' 匹配包含以ab開頭的單詞的行

\>

單詞的結束,如:'ab\>'匹配包含以ab結尾的單詞的行

如:匹配單詞開頭+word+結尾

[email protected]> echo this is a word. |grep '\<word\>'

this is a word.

\w

匹配文字和數字字元,也就是[A-Za-z0-9]

如:'G\w*p' 匹配以G後跟零個或多個文字或數字字元,然後是P ;'G\w*p' 匹配 G123456abp

\W

\w的反置形式,匹配一個或多個非單詞字元,如點號,句號等

如:'G\W*p' 匹配G...:p

\b

單詞鎖定符

如:'\bhello\b'只匹配hello

如:''er\b'' 可以匹配"never" 中的''er'',但不能匹配 "verb"中的 ''er''。

awk使用\y表示此功能

\B

正則表示式之後或者之前不能是空格

如: ''er\B''能匹配"verb"中的''er'',但不能匹配"never"中的 ''er''  (er是結束位置,不能匹配)

\`\`

分別匹配緩衝區的開頭和結尾。通常視為^和$同義

例項:

[email protected]>cat aa.regular

aatestaa

west123es123

[email protected]>cat bb.regular

bbtestbb

[email protected]>cat cc.regular

cctestcc

[email protected]>ls -l |grep '\<aa'  #列出以aa開頭的檔案

[email protected]>grep 'test' c*   #顯示以c開頭的檔案中包含test的行

Cctestcc

[email protected]>grep 'test' a* b* c* #顯示以a,b,c開頭的檔案中包含的test的行

aa.regular:aatestaa

bb.regular:bbtestbb

cc.regular:cctestcc

[email protected]>grep '[a-z]\{5\}' a* #顯示以a開頭的檔案中,至少有5個連續小寫字母的字串的行

aatestaa

[email protected]>grep 'w\(es\)t.*\1' a* #顯示以a開頭的檔案中,包含west並且重複出現過一次es

west123es123

  1. 特殊字元類 (為了在不同國家的字元編碼保持一致)

6.1 POSIX 字符集

模式含義

[::alnum]

匹配文字和數字字元,等效於A-Za-z0-9 

如:ab[[::alnum]] 匹配abc,ab1

[:alpha:]

匹配文字字元;

如:ab[[:alpha:]] 匹配abc

[:blank:]

匹配空格space與定位tab字元

[:cntrl:]

匹配控制字元

[:digit:]

匹配數字字元

[:graph:]

匹配非空格字元

[:lower:]

匹配小寫字母字元

[:print:]

匹配非空字元(包括空格)

[:punct:]

匹配標點符號字元

[:space:]

匹配空格字元 (新行,空格,製表符)

[:upper:]

匹配大寫字母字元

[:xdigit:]

匹配16進位制數字

例項:#匹配一個或多個數字字元或下劃線"_"

[email protected]>echo this num is 123_456 |grep -E '[[:digit:]_]+'

this num is123_456

[email protected]>echo this num is 123456 |grep -E '[[:digit:]_]+'

this num is123456

[email protected]>echo this num is _ |grep -E '[[:digit:]_]+'

this num is _

- 此外,還有以下特殊字元類:

perl類 等效POSIX表示式 描述

----------------------------------------------------------------------------

\o [0-7]

八進位制數字

\O [^0-7]

非八進位制數字

\w [[:alnum:]_]

單詞構成字元

\W [^[:alnum:]_]

非單詞構成字元

\A [^[:alpha:]]

非字母

\L [^[:lower:]]

非小寫字母

\U [^[:upper:]]

非大寫字母

\S [^[:space:]]

非空格符

\D [^[:digit:]]

非數字

\X [^[:xdigit:]]

非十六進位制數字

\P [^[:print:]]

非可列印字元

- 還可以使用以下特殊字元換碼序列:

\r

回車

\n

換行

\b

退格

\t

製表符

\v

垂直製表符

\"

雙引號

\'

單引號

6.2 排序符號

多個字元序列視為一個元素,它使用[.和.]將字元組合括起來。例如,[.cn.]就表示cn字元序列,而單獨的c或n都不行

6.3 等價字符集

等價字符集表示應視為等值的一族字元,使用[=和=]將字元括起來。例如,e和ê,在法語的local 裡,"[[=e=]]" 可能匹配於e/é/è/ê

  1. 單個字元匹配

7.1 一般字元

7.2 轉移meta字元

例如:\.就真表示一個點;\[左方括號;\\表示反斜槓

7.3 . (點號)字元

".hina"表示"任一字元";很少單獨使用,多與其他字元混合匹配多個字元

7.4 方括號表示式

例如:

[cC]hina匹配china 和China;

[^abd]hina匹配除了abd 3個小字母外的任意字母,加上hina.(包括:所有大寫字母,數字,標點符號等)
[a-zA-Z0-9]hina, 匹配[a-z],[A-Z],[0-9]加上hina

  1. 單個表示式匹配多個字元

8.1 星號字元的應用

  • ab*c    ab和c之間匹配0個或多個字元, 即ac,abc,abbc,abbbc……
  • a.*c   a和c之間匹配0個或多個字元 , 即 ac, abc, adc, abbc, accccc …….
  • a.c    a和c之間匹配單個字元, 即 acc, abc, aac, a!c等

8.2 區間表示式的應用

  • ab\{3\}c           a和c之間的b字母重現3次,即 abbbc
  • ab\{3,\}c          a和c之間的b重現至少3次,即 abbbc, abbbbc
  • ab\{3,5\}          a和c之間的b字母重現3次到5次,即abbbc, abbbbc, abbbbbc
  • a\{5\}    a重現5次
  • b\{7,10\}         b重現7次到10次

8.3 匹配多個字元例項

  • ab?c           即ac和abc
  • ab+c              即abc, abbc, abbbc…..但是不匹配ac

+字元的概念和*有點相似,但是+字元要求前置正則表示式至少出現一次

  1. 文字匹配錨點

例項:

字串:   abcxxxABCabcxxxefg

^abc  匹配字串開頭的3個字母abc, 例如 abcxxxABCabcxxxefg

^ABC 匹配字串開頭的ABC

efg$ 匹配結尾處的efg ,$表示結尾,即abcxxxABCabcxxxefg

^$ 匹配空的字串或者空行

  1. 運算子優先順序

BRE運算優先順序

運算子

含義

[..] [==][::]

方括號符號

\meta

轉義的meta字元

[]

方括號表示式

\(\)\n

後向應用表示式

*\{\}

區間表示式和星號表示式

無符號

連續

^$

錨點

  1. ERE中的運算優先順序

運算子

含義

[..][==][::]

方括號符號 

\meta

轉移的meta字元

[]

方括號表示式

()

分組

*+? {}

重複前置的正則表示式

無符號

連續

^$

錨點 (匹配空行)

|

交替

11.更多差異 (後向引用,分組,交替)

11.1 後向引用 (BRE)

使用\(和\) 括起想要之後引用的部分,使用\1-\9引用之前選定的部分

例如: \(ab\)\(cd\)[efg]*\1\2 

ab被括起來,之後使用\1引用;cd被括起來,之後使用\2引用;
[efg]* 表示:e或f或g,或空;

匹配的一些字串是: abcdabcd, abcdeabcd, abcdfabcd, abcdgabcd

例如:\(go\).*\1

匹配的一些字串是: gogo,go1go, go12go, go123go….等

11.2 交替 (ERE)

例如:you|me 匹配you 或者me

11.3 分組 (ERE)

匹配重複情況;如:(go)+匹配一個或者多個連續的go

例子:

man|woman+    匹配字串: man, woman, womann, womannn

(man|woman)+  匹配字串:man,woman, manman,womanwoman

參考書籍:linux shell 從入門到精通

相關推薦

Linux Shell筆記表示式

Linux中,兩種流行的正則表示式引擎 1.POSIX基本正則表示式(BRE)引擎 2.POSIX擴充套件正則表示式(ERE)引擎 sed編輯器只實施了BRE引擎規範的子集 gawk程式使用ERE引擎一、基本正則表示式BRE 1.純文字 # echo "This is a test"| sed -n '/th

Linux Shell筆記表示式

正則表示式概念 正則表示式的文法分為3種標準:BRE、ERE 和 ARE。其中 BER 和 ERE 屬於 POSIX 標準,ARE 則是由各家定義的擴充套件 BRE:基本正則表示式 ERE:在BRE基礎上,擴充套件正則表示式 什麼是POSIX呢,POSIX Portable Operating Syste

[一天幾個linux命令] shell指令碼表示式

shell指令碼之正則表示式 原文連結:Linux–shell指令碼之正則表示式 概念及特點 概念 正則表示式是對字串操作的一種邏輯公式,就是用事先定義好的一些特定的字元、及這些特定字元的組合,組成一個"規則字串",這個"規則字串"用來表達對字串的一種過濾邏輯。規定一些特殊語

Shell學習表示式-----grep

grep 1. 作用 Linux系統中grep命令是一種強大的文字搜尋工具,它能使用正則表示式搜尋文字,並把匹 配的行打印出來。grep全稱是Global Regular Expression Print,表示全域性正則表示式版本,它的使用許可權是所有使用者。 grep家族包括gre

js學習筆記表示式

正則表示式:本質用來記錄文字規則的編碼 構成:由一些普通字元和元字元構成 建立正則表示式兩種方式: 1.通過建構函式定義:var 變數名 = new RegExp(/表示式/); 2.通過直接量定義: var 變數名 = /表示式/; \d表示數字 test()方法:正則物件方法,檢

python學習筆記表示式1

正則表示式 正則表示式即RE,我們可以使用正則表示式來匹配字串集,其實正則表示式是一個小型的程式語言。它可以方便我們對於文字任務的操作。 對於python來說,re模組就是正則式操作模組。 元字元:元字元是特殊的字元,普通的字元在正則表示式中都可以用來匹配自己,如正則表示

shell指令碼表示式、函式、grep、sed、awk、printf等基本命令配置詳解

一、正則表示式 簡介: 正則表示式(或稱Regular Expression,簡稱RE)就是由普通字元(例如字元 a 到 z)以及特殊字元(稱為元字元)組成的文字模式。該模式描述在查詢文字主體時待匹配的一個或多個字串。正則表示式作為一個模板,將某個字元模式與所搜尋的字串進

Python學習筆記表示式

1、import re    # 匯入python正則表示式模組2、正則匹配兩種方式:p = re.compile(r'imooc') # 生成Pattern物件 res = p.match('imooc python') # 呼叫 patern 物件的 matc

shell指令碼學習筆記表示式

         正則表示式一般有三個部分組成,他們分別是:字元類,數量限定符,位置限定符。規定一些特殊語法表示字元類、數 量限定符和位置關係,然後用這些特殊語法和普通字元一起表示一個模式,這就是正則

Linux作業系統基礎操作表示式

grep命令 是一種強大的文字搜尋工具,它能使用正則表示式搜尋文字,並把匹配的行打印出來。grep全稱是Global Regular Expression Print格式: grep [-acinv] ‘keyword’ filename -a:在二進位制檔案用文字方式查詢word字串 -c:計算找到wo

linux表示式中特殊符號的含義

廢話不說,直接上圖 萬用字元與正則表示式 容易混淆,首先要明白二者是不同的,個人感覺萬用字元用於Linux的shell命令(如檔名相關操作)中,而正則表示式用於文字內容中的字串

shell表示式

一 正則表示式 正則表示式:描述某些字串匹配規則的工具 使用原因:程式設計過程中不可避免的遇到處理某些文字情況,有時候要查詢符合某些比較複雜規則的字串。正則表示式以非常簡單的程式碼完成。 常見的支援正則表示式的UNIX工具: grep命令族:用於匹配文字行 se

馬哥學習李洋個人筆記-----表達式

正則表達式正則表達式 什麽是正則表達式?正則表達式就是為了處理大量的文本|字符串而定義的一套規則和方法,通過定義的這些特殊符號的輔助,就可以快速過濾,替換或輸出需要的字符串。Linux正則表達式一般以行為單位處理。 即: 1 正則表達式是一種描述一組字符串的模式。2 為處理大量文本|字符串而定義的一套規則

Python課堂筆記表達式

小寫 多個 一個 指定 pytho 找到 IT groups 表達 正則表達式的基本使用re.match(r’xxx’, 匹配的字符串) 嘗試從字符串的起始位置匹配一個模式匹配成功re.match方法返回一個匹配的對象,否則返回None。可以使用group(num) 或 g

shell學習表達式

passwd 過濾 表達式 roo 輸出 shel 數字和字母 {} 轉義 一、grep使用...語法: grep [-cinvABC] ‘word‘ filename -c :打印符合要求的行數 -i :忽略大小寫 -n :在輸出符合要求的行的同時連同行號一起輸出

JS應用表示式

定義 正則表示式是用於匹配字串中字元組合的模式。 建立正則表示式 兩種方式: 1.new RegExp() let pattern1 = new RegExp('cat'); //第一個引數字串 let pattern2 = new RegEXP('cat', 'ig'); //第二個引數可選模式

【轉】Python表示式(re模組)

【轉】Python之正則表示式(re模組) 本節內容 re模組介紹 使用re模組的步驟 re模組簡單應用示例 關於匹配物件的說明 說說正則表示式字串前的r字首 re模組綜合應用例項 參考文件 提示: 由於該站對MARKDOWN的表格支援的不是很好,所以本文中的表

js中string表示式replace方法詳解

本篇文章主要介紹了js中string之正則表示式replace方法詳解,replace方法是javascript涉及到正則表示式中較為複雜的一個方法,嚴格上說應該是string物件的方法。 replace方法是javascript涉及到正則表示式中較為複雜的一個方法,嚴格上說應該是string物

week4:函式表示式

一、正則表示式 string提供的方法是完全匹配 引入正則表示式是模糊匹配,內嵌在python中,通過呼叫Re模組來實現 二、字元匹配(普通字元,元字元): 普通字元:大多數字符和字母都會和自身匹配 re.findall('alex','yuanalesalexduye') ##

jmeter後置處理器表示式

  一、基本用法——提取某個值 場景:提取某個值,儲存成變數,供後面的介面使用 步驟: 1、執行指令碼,從響應結果中查詢要提取的值,找到左右邊界。 例如要獲取“patientInfoId”作為下一個請求的引數,"patientInfoId":"2c92e0e66680b7da01668