linux shell 正則表達式(BREs,EREs,PREs)差異比較

来源:https://www.cnblogs.com/skyhu365/archive/2019/03/18/10550400.html
-Advertisement-
Play Games

則表達式:在電腦科學中,是指一個用來描述或者匹配一系列符合某個句法規則的字元串的單個字元串。在很多文本編輯器或其他工具里,正則表達式通常被用來檢索和/或替換那些符合某個模式的文本內容。許多程式設計語言都支持利用正則表達式進行字元串操作。例如,在Perl中就內建了一個功能強大的正則表達式引擎。正則表 ...


 

則表達式:在電腦科學中,是指一個用來描述或者匹配一系列符合某個句法規則的字元串的單個字元串。在很多文本編輯器或其他工具里,正則表達式通常被用來檢索和/或替換那些符合某個模式的文本內容。許多程式設計語言都支持利用正則表達式進行字元串操作。例如,在Perl中就內建了一個功能強大的正則表達式引擎。正則表達式這個概念最初是由Unix中的工具軟體(例如sed和grep)普及開的。正則表達式通常縮寫成“regex”,單數有regexp、regex,複數有regexps、regexes、regexen。這些是正則表達式的定義。 由於起源於unix系統,因此很多語法規則一樣的。但是隨著逐漸發展,後來擴展出以下幾個類型。瞭解這些對於學習正則表達式。

 

一、正則表達式分類:

1、基本的正則表達式(Basic Regular Expression 又叫 Basic RegEx  簡稱 BREs)

2、擴展的正則表達式(Extended Regular Expression 又叫 Extended RegEx 簡稱 EREs)

3、Perl 的正則表達式(Perl Regular Expression 又叫 Perl RegEx 簡稱 PREs)

 

說明:只有掌握了正則表達式,才能全面地掌握 Linux 下的常用文本工具(例如:grep、egrep、GUN sed、 Awk 等) 的用法

  

二、Linux 中常用文本工具與正則表達式的關係 

常握 Linux 下幾種常用文本工具的特點,對於我們更好的使用正則表達式是很有幫助的

  • grep , egrep 正則表達式特點:

1)grep 支持:BREs、EREs、PREs 正則表達式

grep 指令後不跟任何參數,則表示要使用 ”BREs“ 

grep 指令後跟 ”-E" 參數,則表示要使用 “EREs“

grep 指令後跟 “-P" 參數,則表示要使用 “PREs"

 

2)egrep 支持:EREs、PREs 正則表達式

egrep 指令後不跟任何參數,則表示要使用 “EREs”

egrep 指令後跟 “-P" 參數,則表示要使用 “PREs"

 

3)grep 與 egrep 正則匹配文件,處理文件方法

a. grep 與 egrep 的處理對象:文本文件

b. grep 與 egrep 的處理過程:查找文本文件中是否含要查找的 “關鍵字”(關鍵字可以是正則表達式) ,如果含有要查找的 ”關健字“,那麼預設返回該文本文件中包含該”關健字“的該行的內容,併在標準輸出中顯示出來,除非使用了“>" 重定向符號,

c. grep 與 egrep 在處理文本文件時,是按行處理的

 

  • sed 正則表達式特點

1)sed 文本工具支持:BREs、EREs

sed 指令預設是使用"BREs"

sed 命令參數 “-r ” ,則表示要使用“EREs"

2)sed 功能與作用

a. sed 處理的對象:文本文件

b. sed 處理操作:對文本文件的內容進行 --- 查找、替換、刪除、增加等操作

c. sed 在處理文本文件的時候,也是按行處理的

  • Awk(gawk)正則表達式特點

1)Awk 文本工具支持:EREs

awk 指令預設是使用 “EREs"

2)Awk 文本工具處理文本的特點

a. awk 處理的對象:文本文件

b. awk 處理操作:主要是對列進行操作

 

 

 

三、常見3中類型正則表達式比較

字元 說明 Basic RegEx Extended RegEx python RegEx Perl regEx
轉義   \ \ \ \
^ 匹配行首,例如'^dog'匹配以字元串dog開頭的行(註意:awk 指令中,'^'則是匹配字元串的開始) ^ ^ ^ ^
$ 匹配行尾,例如:'^、dog$'匹配以字元串 dog 為結尾的行(註意:awk 指令中,'$'則是匹配字元串的結尾) $ $ $ $

^$

匹配空行

^$ ^$ ^$ ^$
^string$ 匹配行,例如:'^dog$'匹配只含一個字元串 dog 的行 ^string$ ^string$ ^string$ ^string$
\< 匹配單詞,例如:'\<frog' (等價於'\bfrog'),匹配以 frog 開頭的單詞 \< \< 不支持 不支持(但可以使用\b來匹配單詞,例如:'\bfrog')

\>

匹配單詞,例如:'frog\>'(等價於'frog\b '),匹配以 frog 結尾的單詞 \> \> 不支持 不支持(但可以使用\b來匹配單詞,例如:'frog\b')

\<x\>

匹配一個單詞或者一個特定字元,例如:'\<frog\>'(等價於'\bfrog\b')、'\<G\>' \<x\> \<x\> 不支持 不支持(但可以使用\b來匹配單詞,例如:'\bfrog\b'

()

匹配表達式,例如:不支持'(frog)' 不支持(但可以使用\(\),如:\(dog\) () () ()

\(\)

匹配表達式,例如:不支持'(frog)' \(\) 不支持(同()) 不支持(同()) 不支持(同())

匹配前面的子表達式 0 次或 1 次(等價於{0,1}),例如:where(is)?能匹配"where" 以及"whereis" 不支持(同\?)
\? 匹配前面的子表達式 0 次或 1 次(等價於'\{0,1\}'),例如:'where\(is\)\? '能匹配 "where"以及"whereis" \? 不支持(同?) 不支持(同?) 不支持(同?)
? 當該字元緊跟在任何一個其他限制符(*, +, ?, {n},{n,}, {n,m}) 後面時,匹配模式是非貪婪的。非貪婪模式儘可能少的匹配所搜索的字元串,而預設的貪婪模式則儘可能多的匹配所搜索的字元串。例如,對於字元串 "oooo",'o+?' 將匹配單個"o",而 'o+' 將匹配所有 'o' 不支持 不支持 不支持 不支持
. 匹配除換行符('\n')之外的任意單個字元(註意:awk 指令中的句點能匹配換行符) . .(如果要匹配包括“\n”在內的任何一個字元,請使用:'(^$)|(.) . .(如果要匹配包括“\n”在內的任何一個字元,請使用:' [.\n] '
* 匹配前面的子表達式 0 次或多次(等價於{0, }),例如:zo* 能匹配 "z"以及 "zoo" * * * *
\+ 匹配前面的子表達式 1 次或多次(等價於'\{1, \}'),例如:'where\(is\)\+ '能匹配 "whereis"以及"whereisis" \+ 不支持(同+) 不支持(同+) 不支持(同+)
+ 匹配前面的子表達式 1 次或多次(等價於{1, }),例如:zo+能匹配 "zo"以及 "zoo",但不能匹配 "z" 不支持(同\+) + + +

{n}

n 必須是一個 0 或者正整數,匹配子表達式 n 次,例如:zo{2}能匹配 不支持(同\{n\}) {n} {n} {n}
{n,} "zooz",但不能匹配 "Bob"n 必須是一個 0 或者正整數,匹配子表達式大於等於 n次,例如:go{2,} 不支持(同\{n,\}) {n,} {n,} {n,}
{n,m} 能匹配 "good",但不能匹配 godm 和 n 均為非負整數,其中 n <= m,最少匹配 n 次且最多匹配 m 次 ,例如:o{1,3}將配"fooooood" 中的前三個 o(請註意在逗號和兩個數之間不能有空格) 不支持(同\{n,m\}) {n,m} {n,m} {n,m}

x|y

匹配 x 或 y,例如: 不支持'z|(food)' 能匹配 "z" 或"food";'(z|f)ood' 則匹配"zood" 或 "food" 不支持(同x\|y) x|y x|y x|y

[0-9]

匹配從 0 到 9 中的任意一個數字字元(註意:要寫成遞增) [0-9] [0-9] [0-9] [0-9]

[xyz]

字元集合,匹配所包含的任意一個字元,例如:'[abc]'可以匹配"lay" 中的 'a'(註意:如果元字元,例如:. *等,它們被放在[ ]中,那麼它們將變成一個普通字元) [xyz] [xyz] [xyz] [xyz]

[^xyz]

負值字元集合,匹配未包含的任意一個字元(註意:不包括換行符),例如:'[^abc]' 可以匹配 "Lay" 中的'L'(註意:[^xyz]在awk 指令中則是匹配未包含的任意一個字元+換行符) [^xyz] [^xyz] [^xyz] [^xyz]
[A-Za-z] 匹配大寫字母或者小寫字母中的任意一個字元(註意:要寫成遞增) [A-Za-z] [A-Za-z] [A-Za-z] [A-Za-z]
[^A-Za-z] 匹配除了大寫與小寫字母之外的任意一個字元(註意:寫成遞增) [^A-Za-z] [^A-Za-z] [^A-Za-z] [^A-Za-z]

\d

匹配從 0 到 9 中的任意一個數字字元(等價於 [0-9]) 不支持 不支持 \d \d

\D

匹配非數字字元(等價於 [^0-9]) 不支持 不支持 \D \D
\S 匹配任何非空白字元(等價於[^\f\n\r\t\v]) 不支持 不支持 \S \S
\s 匹配任何空白字元,包括空格、製表符、換頁符等等(等價於[ \f\n\r\t\v]) 不支持 不支持 \s \s
\W

匹配任何非單詞字元 (等價於[^A-Za-z0-9_])

\W \W \W \W
\w 匹配包括下劃線的任何單詞字元(等價於[A-Za-z0-9_]) \w \w \w \w
\B 匹配非單詞邊界,例如:'er\B' 能匹配 "verb" 中的'er',但不能匹配"never" 中的'er' \B \B \B \B

\b

匹配一個單詞邊界,也就是指單詞和空格間的位置,例如: 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的'er' \b \b \b \b
\t 匹配一個橫向製表符(等價於 \x09和 \cI) 不支持 不支持 \t \t
\v 匹配一個垂直製表符(等價於 \x0b和 \cK) 不支持 不支持 \v \v
\n 匹配一個換行符(等價於 \x0a 和\cJ) 不支持 不支持 \n \n
\f 匹配一個換頁符(等價於\x0c 和\cL) 不支持 不支持 \f \f
\r 匹配一個回車符(等價於 \x0d 和\cM) 不支持 不支持 \r \r
\\ 匹配轉義字元本身"\" \\ \\ \\ \\

\cx

匹配由 x 指明的控制字元,例如:\cM匹配一個Control-M 或回車符,x 的值必須為A-Z 或 a-z 之一,否則,將 c 視為一個原義的 'c' 字元 不支持 不支持   \cx

\xn

匹配 n,其中 n 為十六進位轉義值。十六進位轉義值必須為確定的兩個數字長,例如:'\x41' 匹配 "A"。'\x041' 則等價於'\x04' & "1"。正則表達式中可以使用 ASCII 編碼 不支持 不支持   \xn

\num

匹配 num,其中 num是一個正整數。表示對所獲取的匹配的引用 不支持 \num \num  
[:alnum:] 匹配任何一個字母或數字([A-Za-z0-9]),例如:'[[:alnum:]] ' [:alnum:] [:alnum:] [:alnum:] [:alnum:]
[:alpha:] 匹配任何一個字母([A-Za-z]), 例如:' [[:alpha:]] ' [:alpha:] [:alpha:] [:alpha:] [:alpha:]
[:digit:] 匹配任何一個數字([0-9]),例如:'[[:digit:]] ' [:digit:] [:digit:] [:digit:] [:digit:]
[:lower:] 匹配任何一個小寫字母([a-z]), 例如:' [[:lower:]] ' [:lower:] [:lower:] [:lower:] [:lower:]
[:upper:] 匹配任何一個大寫字母([A-Z]) [:upper:] [:upper:] [:upper:] [:upper:]
[:space:] 任何一個空白字元: 支持製表符、空格,例如:' [[:space:]] ' [:space:] [:space:] [:space:] [:space:]
[:blank:] 空格和製表符(橫向和縱向),例如:'[[:blank:]]'ó'[\s\t\v]' [:blank:] [:blank:] [:blank:] [:blank:]
[:graph:] 任何一個可以看得見的且可以列印的字元(註意:不包括空格和換行符等),例如:'[[:graph:]] ' [:graph:] [:graph:] [:graph:] [:graph:]
[:print:] 任何一個可以列印的字元(註意:不包括:[:cntrl:]、字元串結束符'\0'、EOF 文件結束符(-1), 但包括空格符號),例如:'[[:print:]] ' [:print:] [:print:] [:print:] [:print:]

[:cntrl:]

任何一個控制字元(ASCII 字元集中的前 32 個字元,即:用十進位表示為從 0 到31,例如:換行符、製表符等等),例如:' [[:cntrl:]]'

[:cntrl:]

[:cntrl:]

[:cntrl:]

[:cntrl:]

[:punct:] 任何一個標點符號(不包括:[:alnum:]、[:cntrl:]、[:space:]這些字元集) [:punct:] [:punct:] [:punct:] [:punct:]
[:xdigit:] 任何一個十六進位數(即:0-9,a-f,A-F) [:xdigit:] [:xdigit:] [:xdigit:] [:xdigit:]

 

四、三種不同類型正則表達式比較

註意: 當使用 BERs(基本正則表達式)時,必須在下列這些符號前加上轉義字元('\'),屏蔽掉它們的 speical meaning  “?,+,|,{,},(,)” 這些字元,需要加入轉義符號”\”

 

註意:修飾符用在正則表達式結尾,例如:/dog/i,其中 “ i “ 就是修飾符,它代表的含義就是:匹配時不區分大小寫,那麼修飾符有哪些呢?常見的修飾符如下:

g   全局匹配(即:一行上的每個出現,而不只是一行上的第一個出現)
s    把整個匹配串當作一行處理
m    多行匹配
i    忽略大小寫
x    允許註釋和空格的出現
U    非貪婪匹配

 

以上就是linux 常見3種類型正則表達式異同之處,整體瞭解這些,我相信在使用這些工具的時候,就可以更加清楚明晰了。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 掌握Linux下shell的使用方法。主要介紹Linux shell的語法結構、變數定義以及賦值引用、標點符號、控制語句等。 ...
  • 1.首先檢查是否有一塊硬碟還未被掛載 2.如圖所示,vdb還未被使用,開始分配它吧 3.格式化剛劃分的磁碟,我這裡是格式成ext4格式 4.寫入fstable 5.重新載入fstable,並查看磁碟是否載入成功 ###如上,大功告成啦 最後,贈送上述步驟腳本一枚 ...
  • 以超級用戶工作:su su命令允許臨時變換到任何一用戶標識(如果擁有口令的話),並掛起當前shell,為新用戶開啟一個新的shell。 將當前用戶標識harley變換為weedly,但仍在harley的環境下工作。 同時變換用戶標識和環境。su命令更多用於切換到超級用戶root。此時,我們也希望在r ...
  • centos源不能安裝libmcrypt-devel,由於版權的原因沒有自帶mcrypt的包 有兩種方法解決,一種是使用第三方源,這樣還可以使用yum來安裝,簡單方便,壞處是第三方源多少有中不可靠的感覺。 解決辦法一 1、安裝第三方yum源 wget http://www.atomicorp.com... ...
  • 一 前期準備 提示:相關部署參考《001.Ansible部署RHCS存儲集群》。 二 存儲池概述 2.1 存儲池 Red Hat Ceph存儲池池是Red Hat Ceph存儲集群用於存儲對象的邏輯分區。 池有特定的屬性:池類型,它確定池用於確保數據持久性的保護機制。 replication類型在集 ...
  • Git 分支管理 1. 概念 我們來抽象的理解,分支就是科幻電影裡面的平行宇宙,當你正在電腦前努力學習Git的時候,另一個你正在另一個平行宇宙里努力學習SVN。如果兩個平行宇宙互不幹擾,那對現在的你也沒啥影響。不過,在某個時間點,兩個平行宇宙合併了,結果,你既學會了git又學會了SVN! 那麼分支在 ...
  • [ -a FILE ] 如果 FILE 存在則為真。 [ -b FILE ] 如果 FILE 存在且是一個塊特殊文件則為真。 [ -c FILE ] 如果 FILE 存在且是一個字特殊文件則為真。 [ -d FILE ] 如果 FILE 存在且是一個目錄則為真。 [ -e FILE ] 如果 FIL ...
  • 1.在當前路徑地址欄中直接輸入‘cmd’,然後回車。 2.在當前路徑下,按住‘shift’鍵同時點擊滑鼠右鍵,點擊“在此處打開Powershell”。 其實你會發現,兩個命令行有很大的區別。 cmd: powershell: 事實上對於電腦性能優秀(記憶體上,cmd占用記憶體的情況要比powershel ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...