5 分鍾快速掌握 shell 中的正則表達式


本文首發於眾里千尋 - 5 分鍾快速掌握 shell 中的正則表達式

我經常會在命令行使用 grep 等命令處理一些文本查找的問題。在使用正則表達式的時候經常會碰到一些令人困惑的問題,比如同樣的正則表達式在一個命令中可以用,在另一個命令中卻不可以用。

今天我們來好好整理下 shell 中的正則表達式,這樣在使用的時候能夠輕車熟路。

分類

正則表達式最早在 1950 年代由美國數學家 Stephen Cole Kleene 提出,后來被 Unix 操作系統的文本處理工具廣泛使用。

經過多年的發展和實踐,最終形成兩大標准,一個是 POSIX 標准,另一個是 Perl 標准。后者本是為 Perl 語言實現的,由於其功能非常強大,被 Java、JavaScript 等語言廣泛借鑒,從而被廣泛使用。

我們這里將正則表達式分為三類:

  • 基本正則表達式(Basic Regular Expression 簡稱 BRE),由 POSIX 標准定義。
  • 擴展正則表達式(Extended Regular Expression 簡稱 ERE),也由 POSIX 標准定義。
  • Perl 的正則表達式(Perl Regular Expression 簡稱 PRE),由 Perl 語言定義。

組成部分

基本組成部分

下表展示了正則表達式的基本組成部分。

正則表達式 描述 示例 Basic RegEx Extended RegEx Perl regEx
\ 轉義符,將特殊字符進行轉義,忽略其特殊意義 a.b匹配a.b,但不能匹配ajb,.被轉義為特殊意義 \ \ \
^ 匹配行首 ^tux匹配以tux開頭的行 ^ ^ ^
$ 匹配行尾 tux$匹配以tux結尾的行 $ $ $
. 匹配除換行符\n之外的任意單個字符 ab.匹配abc或bad,不可匹配abcd或abde,只能匹配單字符 . . .
[] 匹配包含在[字符]之中的任意一個字符 coo[kl]可以匹配cook或cool [] [] []
[^] 匹配[^字符]之外的任意一個字符 123[^45]不可以匹配1234或1235,1236、1237都可以 [^] [^] [^]
[-] 匹配[]中指定范圍內的任意一個字符,要寫成遞增 [0-9]可以匹配1、2或3等其中任意一個數字 [-] [-] [-]
? 匹配之前的項1次或者0次 colou?r可以匹配color或者colour,不能匹配colouur 不支持 ? ?
+ 匹配之前的項1次或者多次 sa-6+匹配sa-6、sa-666,不能匹配sa- 不支持 + +
* 匹配之前的項0次或者多次 co*l匹配cl、col、cool、coool等 * * *
() 匹配表達式,創建一個用於匹配的子串 ma(tri)?匹配max或maxtrix 不支持 () ()
{n} 匹配之前的項n次,n是可以為0的正整數 [0-9]{3}匹配任意一個三位數,可以擴展為[0-9][0-9][0-9] 不支持 {n} {n}
{n,} 之前的項至少需要匹配n次 [0-9]{2,}匹配任意一個兩位數或更多位數 不支持 {n,} {n,}
{n,m} 指定之前的項至少匹配n次,最多匹配m次,n<=m [0-9]{2,5}匹配從兩位數到五位數之間的任意一個數字 不支持 {n,m} {n,m}
| 交替匹配|兩邊的任意一項 ab(c|d)匹配abc或abd 不支持 | |

POSIX 字符類

POSIX字符類是一個形如[:...:]的特殊元序列(meta sequence),他可以用於匹配特定的字符范圍。

正則表達式 描述 示例 Basic RegEx Extended RegEx Perl RegEx
[:alnum:] 匹配任意一個字母或數字字符 [[:alnum:]]+ [:alnum:] [:alnum:] [:alnum:]
[:alpha:] 匹配任意一個字母字符(包括大小寫字母) [[:alpha:]]{4} [:alpha:] [:alpha:] [:alpha:]
[:blank:] 空格與制表符(橫向和縱向) [[:blank:]]* [:blank:] [:blank:] [:blank:]
[:digit:] 匹配任意一個數字字符 [[:digit:]]? [:digit:] [:digit:] [:digit:]
[:lower:] 匹配小寫字母 [[:lower:]]{5,} [:lower:] [:lower:] [:lower:]
[:upper:] 匹配大寫字母 ([[:upper:]]+)? [:upper:] [:upper:] [:upper:]
[:punct:] 匹配標點符號 [[:punct:]] [:punct:] [:punct:] [:punct:]
[:space:] 匹配一個包括換行符、回車等在內的所有空白符 [[:space:]]+ [:space:] [:space:] [:space:]
[:graph:] 匹配任何一個可以看得見的且可以打印的字符 [[:graph:]] [:graph:] [:graph:] [:graph:]
[:xdigit:] 任何一個十六進制數(即:0-9,a-f,A-F) [[:xdigit:]]+ [:xdigit:] [:xdigit:] [:xdigit:]
[:cntrl:] 任何一個控制字符(ASCII字符集中的前32個字符) [[:cntrl:]] [:cntrl:] [:cntrl:] [:cntrl:]
[:print:] 任何一個可以打印的字符 [[:print:]] [:print:] [:print:] [:print:]

元字符

元字符(meta character)是一種 Perl 風格的正則表達式,只有一部分文本處理工具支持它,並不是所有的文本處理工具都支持。

正則表達式 描述 示例 Basic RegEx Extended RegEx Perl RegEx
\b 單詞邊界 \bcool\b 匹配cool,不匹配coolant \b \b \b
\B 非單詞邊界 cool\B 匹配coolant,不匹配cool \B \B \B
\d 單個數字字符 b\db 匹配b2b,不匹配bcb 不支持 不支持 \d
\D 單個非數字字符 b\Db 匹配bcb,不匹配b2b 不支持 不支持 \D
\w 單個單詞字符(字母、數字與_) \w 匹配1或a,不匹配& \w \w \w
\W 單個非單詞字符 \W 匹配&,不匹配1或a \W \W \W
\n 換行符 \n 匹配一個新行 不支持 不支持 \n
\s 單個空白字符 x\sx 匹配x x,不匹配xx 不支持 不支持 \s
\S 單個非空白字符 x\S\x 匹配xkx,不匹配xx 不支持 不支持 \S
\r 回車 \r 匹配回車 不支持 不支持 \r
\t 橫向制表符 \t 匹配一個橫向制表符 不支持 不支持 \t
\v 垂直制表符 \v 匹配一個垂直制表符 不支持 不支持 \v
\f 換頁符 \f 匹配一個換頁符 不支持 不支持 \f

常見命令中的使用

命令 Basic RegEx Extended RegEx Perl RegEx
grep 支持 需加 -E 參數 需加 -P 參數
egrep 支持 支持 需加 -P 參數
sed 支持 需加 -r 參數 不支持
awk 支持 支持 不支持

常見面試知識點、技術解決方案、教程,都可以掃碼關注公眾號“眾里千尋”獲取,或者來這里 https://everfind.github.io

眾里千尋


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM