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
插入符號(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
點(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ā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
問號(hào)(\?)匹配零個(gè)或一個(gè)匹配前面的字符。下面的例子匹配“Behaviour”和“Behavior”。在這里,我們通過使用“\?”使“u”作為一個(gè)可選的字符。
[jerry]$ echo -e "Behaviour\nBehavior" | sed -n '/Behaviou\?r/ p'
執(zhí)行上面的代碼,會(huì)得到如下結(jié)果:
Behaviour Behavior
加號(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
星號(hào)(*)匹配零個(gè)或多個(gè)發(fā)生了前面的字符。下面的例子匹配"ca", "cat", "catt"等依此類推。
[jerry]$ echo -e "ca\ncat" | sed -n '/cat*/ p'
執(zhí)行上面的代碼,會(huì)得到如下結(jié)果:
ca cat
{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
{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} 表達(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
有哪些有在Sed有特殊含義的特殊字符。例如,用“\n”表示換行,回車被為“\r”表示,依此類推。要使用這些字符轉(zhuǎn)換成普通的ASCII,我們必須使用反斜杠(\)字符轉(zhuǎn)義。本章說明了轉(zhuǎn)義特殊字符。
下面的例子匹配的模式“\”。
[jerry]$ echo 'str1\str2' | sed -n '/\\/ p'
執(zhí)行上面的代碼,會(huì)得到如下結(jié)果:
str1\str2
下面的示例將新行字符匹配。
[jerry]$ echo 'str1\nstr2' | sed -下一篇:sed模式緩沖區(qū)