https://www.cnblogs.com/zoe233/p/11919424.html
https://www.jb51.net/article/186283.htm
正則表達(dá)式:在計(jì)算機(jī)科學(xué)中,是指一個(gè)用來描述或者匹配一系列符合某個(gè)句法規(guī)則的字符串的單個(gè)字符串弥锄。在很多文本編輯器或其他工具里户魏,正則表達(dá)式通常被用來檢索或替換那些符合某個(gè)模式的文本內(nèi)容。正則表達(dá)式這個(gè)概念最初是由Unix中的工具軟件(例如sed和grep)普及開的豪治。
只有掌握了正則表達(dá)式,才能全面地掌握 Linux 下的常用文本工具(例如:grep扯罐、egrep负拟、GUN sed、 Awk 等) 的用法
與正則有關(guān)的選項(xiàng)參數(shù)
grep歹河、sed掩浙、awk天然支持正則
grep -v代表反選捶牢,反向選擇匹配到的內(nèi)容
grep -E代表使用擴(kuò)展正則
grep -P代表使用Perl正則
sed -r 代表使用擴(kuò)展正則
正則表達(dá)式分類
正則表達(dá)式分為三類(man grep可以看到碴倾,分別是basic RegExs恬涧,extended RegExs个扰,perl RegExs)
1可缚、基本的正則表達(dá)式(Basic Regular Expression 又叫 Basic RegEx 簡稱 BREs)
2充坑、擴(kuò)展的正則表達(dá)式(Extended Regular Expression 又叫 Extended RegEx 簡稱 EREs)
3吵聪、Perl 的正則表達(dá)式(Perl Regular Expression 又叫 Perl RegEx 簡稱 PREs)
常用文本工具與正則表達(dá)式的關(guān)系
指令 | BREs | EREs | PREs | 處理對(duì)象 |
---|---|---|---|---|
grep | egrep | grep | grep -E | |
egrep | grep -P | |||
egrep -P | a. 處理對(duì)象:文本文件 |
b. 處理過程:查找文本文件中是否包含要查找的 “關(guān)鍵字”(關(guān)鍵字可以是正則表達(dá)式) 硫嘶,默認(rèn)返回匹配的該行的內(nèi)容
c. grep|egrep處理文件時(shí)经备,按行處理 |
| sed | sed | sed -r | - | a. 處理對(duì)象:文本文件
b.處理操作:對(duì)文本文件的內(nèi)容進(jìn)行 查找拭抬、替換、刪除侵蒙、增加等操作
c. sed 在處理文本文件的時(shí)候玖喘,按行處理 |
| awk | - | awk | - | a. awk 處理的對(duì)象:文本文件
b. awk 處理操作:主要是對(duì)列進(jìn)行操作 |
三種正則比較**
字符 | BREs | EREs | PREs | 說明 | |
---|---|---|---|---|---|
轉(zhuǎn)義 | \ | \ | \ | 轉(zhuǎn)義 | |
^ | ^ | ^ | ^ | 匹配行首,例如'^dog'匹配以字符串dog開頭的行(注意:awk 指令中蘑志,^則是匹配字符串的開始) | |
$ | $ | $ | $ | 匹配行尾累奈,例如:'^、dog |
|
^$ | ^$ | ^$ | ^$ | 匹配空行 | |
^string$ | ^string$ | ^string$ | ^string$ | 匹配行澎媒,例如:'^dog$'匹配只含一個(gè)字符串 dog 的行 | |
\< | \< | \< | X 同\b | 匹配單詞,例如:'\<frog' (等價(jià)于'\bfrog')波桩,匹配以 frog 開頭的單詞 | |
> | \> | \> | 匹配單詞戒努,例如:'frog\>'(等價(jià)于'frog\b '),匹配以 frog 結(jié)尾的單詞 | ||
<x> | \<x\> | \<x\> | 匹配一個(gè)單詞或者一個(gè)特定字符,例如:'\<frog\>'(等價(jià)于'\bfrog\b')储玫、'\<G\>' | ||
() | **X **同\(\) | () | () | 匹配表達(dá)式侍筛,例如:不支持'(frog)' | |
() | \(\) | **X ** | **X**** ** | 匹配表達(dá)式,例如:不支持'(frog)' | |
撒穷? | X(同?) | 匣椰? | ? | 匹配前面的子表達(dá)式 0 次或 1 次(等價(jià)于{0,1})端礼,例如:where(is)?能匹配"where" 以及"whereis" | |
\? | \? | **X ** | **X**** ** | 匹配前面的子表達(dá)式 0 次或 1 次(等價(jià)于'\{0,1\}')禽笑,例如:'where\(is\)\? '能匹配 "where"以及"whereis" | |
?(非貪婪模式) | **X ** | **X ** | **X**** ** | 當(dāng)該字符緊跟在任何一個(gè)其他限制符(*, +, ?, {n},{n,}, {n,m}) 后面時(shí),匹配模式是非貪婪的蛤奥。非貪婪模式盡可能少的匹配所搜索的字符串佳镜,而默認(rèn)的貪婪模式則盡可能多的匹配所搜索的字符串。例如凡桥,對(duì)于字符串 "oooo"蟀伸,'o+?' 將匹配單個(gè)"o",而 'o+' 將匹配所有 'o' | |
. | . | . | . | 匹配除換行符('\n')之外的任意單個(gè)字符(注意:awk 指令中的句點(diǎn)能匹配換行符) | |
* | * | * | * | 匹配前面的子表達(dá)式 0 次或多次(等價(jià)于{0, })缅刽,例如:zo* 能匹配 "z"以及 "zoo" | |
\+ | \+ | X(同+) | X(同+) | 匹配前面的子表達(dá)式 1 次或多次(等價(jià)于'\{1, \}')望蜡,例如:'where\(is\)\+ '能匹配 "whereis"以及"whereisis" | |
+ | X(同\+) | + | + | 匹配前面的子表達(dá)式 1 次或多次(等價(jià)于{1, }),例如:zo+能匹配 "zo"以及 "zoo"拷恨,但不能匹配 "z" | |
{n} | X(同{n}) | {n} | {n} | n 必須是一個(gè) 0 或者正整數(shù),匹配子表達(dá)式 n 次谢肾,例如: | |
zo{2}能匹配"zooz"腕侄,但不能匹配 "Bob" | |||||
{n,} | X(同\{n,\}) | {n,} | {n,} | n 必須是一個(gè) 0 或者正整數(shù),匹配子表達(dá)式大于等于 n次芦疏,例如:go{2,}能匹配 "good"分预,但不能匹配 god | |
{n,m} | X(同\{n,m\}) | {n,m} | {n,m} | m 和 n 均為非負(fù)整數(shù),其中 n <= m薪捍,最少匹配 n 次且最多匹配 m 次 笼痹,例如:o{1,3}將配"fooooood" 中的前三個(gè) o(請(qǐng)注意在逗號(hào)和兩個(gè)數(shù)之間不能有空格) | |
x | y | X(同x\|y) | x|y | x|y | 匹配 x 或 y,例如: 不支持'z|(food)' 能匹配 "z" 或"food"酪穿;'(z|f)ood' 則匹配"zood" 或 "food" |
[0-9] | [0-9] | [0-9] | [0-9] | 匹配從 0 到 9 中的任意一個(gè)數(shù)字字符(注意:要寫成遞增) | |
[xyz] | [xyz] | [xyz] | [xyz] | 字符集合救赐,匹配所包含的任意一個(gè)字符,例如:'[abc]'可以匹配"lay" 中的 'a'(注意:如果元字符只磷,例如:. *等经磅,它們被放在[ ]中泌绣,那么它們將變成一個(gè)普通字符) | |
[^xyz] | [^xyz] | [^xyz] | [^xyz] | 負(fù)值字符集合,匹配未包含的任意一個(gè)字符(注意:不包括換行符)预厌,例如:'[^abc]' 可以匹配 "Lay" 中的'L'(注意:[^xyz]在awk 指令中則是匹配未包含的任意一個(gè)字符+換行符) | |
[A-Za-z] | [A-Za-z] | [A-Za-z] | [A-Za-z] | 匹配大寫字母或者小寫字母中的任意一個(gè)字符(注意:要寫成遞增) | |
[^A-Za-z] | [^A-Za-z] | [^A-Za-z] | [^A-Za-z] | 匹配除大小寫字母之外的任意一個(gè)字符(注意:寫成遞增) | |
\d | 不支持 | 不支持 | \d | 匹配從 0 到 9 中的任意一個(gè)數(shù)字字符(等價(jià)于 [0-9]) | |
\D | 不支持 | 不支持 | \D | 匹配非數(shù)字字符(等價(jià)于 [^0-9]) | |
\S | 不支持 | 不支持 | \S | 匹配任何非空白字符(等價(jià)于[^\f\n\r\t\v]) | |
\s | 不支持 | 不支持 | \s | 匹配任何空白字符阿迈,包括空格、制表符配乓、換頁符等等(等價(jià)于[ \f\n\r\t\v]) | |
\W | \W | \W | \W | 匹配任何非單詞字符 (等價(jià)于[^A-Za-z0-9_]) | |
\w | \w | \w | \w | 匹配包括下劃線的任何單詞字符(等價(jià)于[A-Za-z0-9_]) | |
\B | \B | \B | \B | 匹配非單詞邊界仿滔,例如:'er\B' 能匹配 "verb" 中的'er',但不能匹配"never" 中的'er' | |
\b | \b | \b | \b | 匹配一個(gè)單詞邊界犹芹,也就是指單詞和空格間的位置崎页,例如: 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的'er' | |
\t | 不支持 | 不支持 | \t | 匹配一個(gè)橫向制表符(等價(jià)于 \x09和 \cI) | |
\v | 不支持 | 不支持 | \v | 匹配一個(gè)垂直制表符(等價(jià)于 \x0b和 \cK) | |
\n | 不支持 | 不支持 | \n | 匹配一個(gè)換行符(等價(jià)于 \x0a 和\cJ) | |
\f | 不支持 | 不支持 | \f | 匹配一個(gè)換頁符(等價(jià)于\x0c 和\cL) | |
\r | 不支持 | 不支持 | \r | 匹配一個(gè)回車符(等價(jià)于 \x0d 和\cM) | |
\\ | \\ | \\ | \\ | 匹配轉(zhuǎn)義字符本身"\" | |
\cx | 不支持 | 不支持 | \cx | 匹配由 x 指明的控制字符腰埂,例如:\cM匹配一個(gè)Control-M 或回車符飒焦,x 的值必須為A-Z 或 a-z 之一,否則屿笼,將 c 視為一個(gè)原義的 'c' 字符 | |
\xn | 不支持 | 不支持 | \xn | 匹配 n牺荠,其中 n 為十六進(jìn)制轉(zhuǎn)義值。十六進(jìn)制轉(zhuǎn)義值必須為確定的兩個(gè)數(shù)字長驴一,例如:'\x41' 匹配 "A"休雌。'\x041' 則等價(jià)于'\x04' & "1"。正則表達(dá)式中可以使用 ASCII 編碼 | |
\num | 不支持 | \num | 匹配 num肝断,其中 num是一個(gè)正整數(shù)杈曲。表示對(duì)所獲取的匹配的引用 | ||
[:alnum:] | [:alnum:] | [:alnum:] | [:alnum:] | 匹配任何一個(gè)字母或數(shù)字([A-Za-z0-9]),例如:'[[:alnum:]] ' | |
[:alpha:] | [:alpha:] | [:alpha:] | [:alpha:] | 匹配任何一個(gè)字母([A-Za-z])胸懈, 例如:' [[:alpha:]] ' | |
[:digit:] | [:digit:] | [:digit:] | [:digit:] | 匹配任何一個(gè)數(shù)字([0-9])担扑,例如:'[[:digit:]] ' | |
[:lower:] | [:lower:] | [:lower:] | [:lower:] | 匹配任何一個(gè)小寫字母([a-z]), 例如:' [[:lower:]] ' | |
[:upper:] | [:upper:] | [:upper:] | [:upper:] | 匹配任何一個(gè)大寫字母([A-Z]) | |
[:space:] | [:space:] | [:space:] | [:space:] | 任何一個(gè)空白字符: 支持制表符趣钱、空格涌献,例如:' [[:space:]] ' | |
[:blank:] | [:blank:] | [:blank:] | [:blank:] | 空格和制表符(橫向和縱向),例如:'[[:blank:]]'ó'[\s\t\v]' | |
[:graph:] | [:graph:] | [:graph:] | [:graph:] | 任何一個(gè)可以看得見的且可以打印的字符(注意:不包括空格和換行符等)首有,例如:'[[:graph:]] ' | |
[:print:] | [:print:] | [:print:] | [:print:] | 任何一個(gè)可以打印的字符(注意:不包括:[:cntrl:]燕垃、字符串結(jié)束符'\0'、EOF 文件結(jié)束符(-1)井联, 但包括空格符號(hào))利术,例如:'[[:print:]] ' | |
[:cntrl:] | [:cntrl:] | [:cntrl:] | [:cntrl:] | 任何一個(gè)控制字符(ASCII 字符集中的前 32 個(gè)字符,即:用十進(jìn)制表示為從 0 到31低矮,例如:換行符印叁、制表符等等),例如:' [[:cntrl:]]' | |
[:punct:] | [:punct:] | [:punct:] | [:punct:] | 任何一個(gè)標(biāo)點(diǎn)符號(hào)(不包括:[:alnum:]、[:cntrl:]轮蜕、[:space:]這些字符集) | |
[:xdigit:] | [:xdigit:] | [:xdigit:] | [:xdigit:] | 任何一個(gè)十六進(jìn)制數(shù)(即:0-9昨悼,a-f,A-F) |
基礎(chǔ)正則表達(dá)式說明
- ^ 以...開頭
- ^d 以d開頭
- ^word 匹配以word開頭的內(nèi)容
- 在vi/vim編輯器里跃洛,^代表一行的開頭
- $ 以...結(jié)尾
- word$ 匹配以word結(jié)尾的內(nèi)容
- 在vi/vim編輯器里率触,$代表一行的結(jié)尾
- ^$ 表示空行
- 代表且只能代表任意一個(gè)字符
- \ 轉(zhuǎn)義符號(hào)
- 讓特殊符號(hào)代表其本身
-
- 重復(fù)0個(gè)或多個(gè)前面的一個(gè)字符
- 例如:o* 匹配,沒有"o"汇竭,有1個(gè)"o"葱蝗,或多個(gè)"o"
- .* 匹配所有字符
- 延伸:
- ^.*以任意多個(gè)字符開頭
- .*$ 以任意多個(gè)字符結(jié)尾
- 延伸:
- [abc] 匹配字符集合內(nèi)的任意一個(gè)字符[a-zA-Z],[0-9]细燎。
- [^abc] 匹配不包含^后的任意一個(gè)字符的內(nèi)容 []內(nèi)的^ 為取反两曼,注意和中括號(hào)外面的^(以...開頭的區(qū)別)
- a{n,m} 重復(fù)n到m次,前一個(gè)重復(fù)的字符玻驻。
- 如果用egrep 或 sed -r 可以去掉斜線
- grep -E 也可以去掉斜線
- a{n,} 重復(fù)至少n次悼凑,前一個(gè)重復(fù)的字符。
- 如果用egrep 或 sed -r 可以去掉斜線
- grep -E 也可以去掉斜線
- a{n} 重復(fù)n次璧瞬,前一個(gè)重復(fù)的字符户辫。
- 如果用egrep 或 sed -r 可以去掉斜線
- grep -E 也可以去掉斜線
- a{,m} 重復(fù)最多m次
- grep -E 也可以去掉斜線
- a{n,m} 重復(fù)n到m次,前一個(gè)重復(fù)的字符玻驻。
注意:egrep 或 sed -r 默認(rèn)使用擴(kuò)展正則表達(dá)式(EREs),一般特殊字符({})可以不轉(zhuǎn)義
擴(kuò)展正則表達(dá)式說明
grep -E 以及egrep(Extend Regular Expression)
- 表示重復(fù)“一個(gè)或一個(gè)以上”前面的字符(* 是 0 個(gè)或多個(gè))
- 嗤锉? 表示重復(fù) “0個(gè)或1個(gè)”前面的字符(. 是有且只有1個(gè))
- | 表示同時(shí)過濾多個(gè)字符串
- () 分組過濾渔欢,后向引用
通配符
Linux通配符和三劍客的正則表達(dá)式是不一樣的,因此瘟忱,代表的意義也有較大的區(qū)別奥额。
通配符一般用戶命令行bash環(huán)境,而linux正則表達(dá)式用于grep, sed, awk場景酷誓。
通配符說明
- 代表任意0-N個(gè)字符,代表所有字符
- ? 代表任意1個(gè)字符
- ; 連續(xù)不同命令的分隔符
-
配置文件注釋
- | 管道:效率并不高
- ~ 當(dāng)前用戶的家目錄
- 上一次的目錄
- 例如:cd - 進(jìn)入上一次的目錄
- $ 變量前需要加的符號(hào)
- 例如:echo $LANG 輸出變量的內(nèi)容
- / 路徑分隔符號(hào)态坦,也是根
1> 重定向盐数,覆蓋
追加重定向,追加內(nèi)容到文件尾部
- < 輸入重定向(xargs伞梯,tr)
- << 追加輸入重定向(cat)
示例:* 的使用:代表任意0-N個(gè)字符玫氢,代表所有字符