鍍金池/ 教程/ Linux/ Sed正則表達(dá)式
Sed字符串
Sed實(shí)用功能
Sed管理模式
sed環(huán)境設(shè)置
sed模式緩沖區(qū)
Sed循環(huán)
Sed模式范圍
Sed教程
Sed正則表達(dá)式
Sed分支
Sed基本語(yǔ)法
sed工作流程
Sed特殊字符
Sed基本命令

Sed正則表達(dá)式

sed是強(qiáng)大,高效的處理正則表達(dá)式。一些復(fù)雜的任務(wù),可以解決簡(jiǎn)單的正則表達(dá)式。任何命令行專家都知道正則表達(dá)式的威力。

本教程介紹了標(biāo)準(zhǔn)的正則表達(dá)式,POSIX類的正則表達(dá)式和元字符。考慮我們有一個(gè)文本文件 books.txt 將被處理,它有以下內(nèi)容:

A Storm of Swords, George R. R. Martin
The Two Towers, J. R. R. Tolkien
The Alchemist, Paulo Coelho
The Fellowship of the Ring, J. R. R. Tolkien
The Pilgrimage, Paulo Coelho
A Game of Thrones, George R. R. Martin

標(biāo)準(zhǔn)的正則表達(dá)式

行開始 (^)

插入符號(hào)(^)符號(hào)用于一行的開始匹配。下面的例子打印所有的啟動(dòng)與模式“the”行。

[jerry]$ sed -n '/^The/ p' books.txt

執(zhí)行上面的代碼,會(huì)得到如下結(jié)果:

The Two Towers, J. R. R. Tolkien
The Alchemist, Paulo Coelho
The Fellowship of the Ring, J. R. R. Tolkien
The Pilgrimage, Paulo Coelho

行尾 ($)

行尾是由美元符號(hào)($)符號(hào)表示。下面的例子打印“Coelho”結(jié)尾的行。

[jerry]$ sed -n '/Coelho$/ p' books.txt 

執(zhí)行上面的代碼,會(huì)得到如下結(jié)果:

The Alchemist, Paulo Coelho 
The Pilgrimage, Paulo Coelho

單個(gè)字符(.)

點(diǎn)(.)匹配除行字符結(jié)尾的任何單個(gè)字符。下面的例子打印所有三個(gè)字母的單詞字符 “t” 結(jié)尾。

[jerry]$ echo -e "cat\nbat\nrat\nmat\nbatting\nrats\nmats" | sed -n '/^..t$/p' 

執(zhí)行上面的代碼,會(huì)得到如下結(jié)果:

cat 
bat 
rat 
mat

匹配字符集合 ([])

字符集是用方括號(hào)([])表示。它用來匹配只有1個(gè)之中的幾個(gè)字符。下面的例子匹配模式“Call”和“Tall”,而不是“Ball”。

[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[CT]all/ p'

執(zhí)行上面的代碼,會(huì)得到如下結(jié)果:

Call 
Tall

獨(dú)有集 ([^])

當(dāng)使用的字符集使用時(shí),插入符否定集在方括號(hào)字符。只有下面的示例打印“Ball”。

[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[^CT]all/ p'

執(zhí)行上面的代碼,會(huì)得到如下結(jié)果:

Ball 

字符范圍 ([-])

當(dāng)被提供的字符范圍,則正則表達(dá)式匹配在方括號(hào)中指定的范圍內(nèi)的任何字符。下面的例子匹配“Call”和“Tall”,而不是“Ball”。

[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[C-Z]all/ p' 

執(zhí)行上面的代碼,會(huì)得到如下結(jié)果:

Call 
Tall

現(xiàn)在,讓我們修改范圍為“A-P”,并觀察結(jié)果。

[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[A-P]all/ p' 

執(zhí)行上面的代碼,會(huì)得到如下結(jié)果:

Call 
Ball

零到一次出現(xiàn) (\?)

問號(hào)(\?)匹配零個(gè)或一個(gè)匹配前面的字符。下面的例子匹配“Behaviour”和“Behavior”。在這里,我們通過使用“\?”使“u”作為一個(gè)可選的字符。

[jerry]$ echo -e "Behaviour\nBehavior" | sed -n '/Behaviou\?r/ p' 

執(zhí)行上面的代碼,會(huì)得到如下結(jié)果:

Behaviour 
Behavior

一次或多次出現(xiàn) (\+)

加號(hào)(\+)匹配前面的字符出現(xiàn)一次或多次。下面的例子匹配“2”出現(xiàn)一次或多次。

[jerry]$ echo -e "111\n22\n123\n234\n456\n222"  | sed -n '/2\+/ p'

執(zhí)行上面的代碼,會(huì)得到如下結(jié)果:

22 
123 
234 
222 

零或多次出現(xiàn) (*)

星號(hào)(*)匹配零個(gè)或多個(gè)發(fā)生了前面的字符。下面的例子匹配"ca", "cat", "catt"等依此類推。

[jerry]$ echo -e "ca\ncat" | sed -n '/cat*/ p' 

執(zhí)行上面的代碼,會(huì)得到如下結(jié)果:

ca 
cat 

n個(gè)重復(fù) {n}

{n}表達(dá)完全一致的“n”出現(xiàn)前面的字符。下面的例子打印只有三個(gè)數(shù)字。但在這之前,你需要?jiǎng)?chuàng)建以下文件,該文件僅包含數(shù)字??紤] numbers.txt 有以下內(nèi)容:

1 
10 
100 
1000 
10000 
100000 
1000000 
10000000 
100000000 
1000000000

現(xiàn)在讓我們編寫 Sed 表達(dá)式。在這里,對(duì)花括號(hào)中的“\”字符轉(zhuǎn)義。

[jerry]$ sed -n '/^[0-9]\{3\}$/ p' numbers.txt 

執(zhí)行上面的代碼,會(huì)得到如下結(jié)果:

100

最少出現(xiàn)n個(gè) {n,}

{n,} 表達(dá)式匹配,至少是“n”出現(xiàn)前面的字符。下面的例子打印大于或等于5個(gè)數(shù)字的所有數(shù)字。

[jerry]$ sed -n '/^[0-9]\{5,\}$/ p' numbers.txt

執(zhí)行上面的代碼,會(huì)得到如下結(jié)果:

10000 
100000 
1000000
10000000 
100000000 
1000000000 

M到N次出現(xiàn) {m, n}

{m, n} 表達(dá)式匹配,至少是“M”和最“N”出現(xiàn)前面的字符。下面的例子打印所有具有至少5個(gè)數(shù)字,但不超過8位的數(shù)字。

[jerry]$ sed -n '/^[0-9]\{5,8\}$/ p' numbers.txt

執(zhí)行上面的代碼,會(huì)得到如下結(jié)果:

10000 
100000 
1000000 
10000000 

管道(|)

管道符的行為類似于邏輯或運(yùn)算。它從管的兩側(cè)相匹配的條目。下面的例子要么匹配"str1" 和 "str3"。這里,一對(duì)括號(hào)和管道 (|) 由“\”字符轉(zhuǎn)義。

[jerry]$ echo -e "str1\nstr2\nstr3\nstr4" | sed -n '/str\(1\|3\)/ p' 

執(zhí)行上面的代碼,會(huì)得到如下結(jié)果:

str1 
str3

字符轉(zhuǎn)義

有哪些有在Sed有特殊含義的特殊字符。例如,用“\n”表示換行,回車被為“\r”表示,依此類推。要使用這些字符轉(zhuǎn)換成普通的ASCII,我們必須使用反斜杠(\)字符轉(zhuǎn)義。本章說明了轉(zhuǎn)義特殊字符。

轉(zhuǎn)義 "\"

下面的例子匹配的模式“\”。

[jerry]$ echo 'str1\str2' | sed -n '/\\/ p'

執(zhí)行上面的代碼,會(huì)得到如下結(jié)果:

str1\str2 

轉(zhuǎn)義 "\n"

下面的示例將新行字符匹配。

[jerry]$ echo 'str1\nstr2' | sed -下一篇:sed模式緩沖區(qū)