第十二課:正則表達式基礎

1.基本語法

選擇

|豎直分隔符表示選擇榛臼,例如"boy|girl"可以匹配"boy"或者"girl"

數(shù)量限定

數(shù)量限定除了我們舉例用的*,還有+加號,?問號,如果在一個模式中不加數(shù)量限定符則表示出現(xiàn)一次且僅出現(xiàn)一次:

  • +表示前面的字符必須出現(xiàn)至少一次(1次或多次)伊佃,例如,"goo+gle",可以匹配"gooogle","goooogle"等;
  • ?表示前面的字符最多出現(xiàn)一次(0次或1次),例如恩伺,"colou?r",可以匹配"color"或者"colour";
  • 星號代表前面的字符可以不出現(xiàn)尉姨,也可以出現(xiàn)一次或者多次(0次、或1次姚淆、或多次)罐孝,例如县匠,“042”可以匹配42媳友、042斯议、0042、00042等醇锚。
范圍與優(yōu)先級

()圓括號可以用來定義模式字符串的范圍和優(yōu)先級哼御,這可以簡單的理解為是否將括號內的模式串作為一個整體。例如焊唬,"gr(a|e)y"等價于"gray|grey"恋昼,(這里體現(xiàn)了優(yōu)先級,豎直分隔符用于選擇a或者e而不是gra和ey)赶促,"(grand)?father"匹配father和grandfather(這里體驗了范圍液肌,?將圓括號內容作為一個整體匹配)。

語法

字符 描述
\ 將下一個字符標記為一個特殊字符鸥滨、或一個原義字符嗦哆。例如,“n”匹配字符“n”婿滓±纤伲“\n”匹配一個換行符。序列“\”匹配“\”而“(”則匹配“(”空幻。
^ 匹配輸入字符串的開始位置。
$ 匹配輸入字符串的結束位置容客。
{n} n是一個非負整數(shù)秕铛。匹配確定的n次。例如缩挑,“o{2}”不能匹配“Bob”中的“o”但两,但是能匹配“food”中的兩個o。
{n,} n是一個非負整數(shù)供置。至少匹配n次谨湘。例如,“o{2,}”不能匹配“Bob”中的“o”芥丧,但能匹配“foooood”中的所有o紧阔。“o{1,}”等價于“o+”续担∩玫ⅲ“o{0,}”則等價于“o*”。
{n,m} m和n均為非負整數(shù)物遇,其中n<=m乖仇。最少匹配n次且最多匹配m次憾儒。例如,“o{1,3}”將匹配“fooooood”中的前三個o乃沙∑鹬海“o{0,1}”等價于“o?”。請注意在逗號和兩個數(shù)之間不能有空格警儒。
* 匹配前面的子表達式零次或多次训裆。例如,zo能匹配“z”冷蚂、“zo”以及“zoo”缭保。等價于{0,}。
+ 匹配前面的子表達式一次或多次蝙茶。例如艺骂,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”隆夯。+等價于{1,}钳恕。
? 匹配前面的子表達式零次或一次。例如蹄衷,“do(es)?”可以匹配“do”或“does”中的“do”忧额。?等價于{0,1}。
? 當該字符緊跟在任何一個其他限制符(*,+,?愧口,{n}睦番,{n,},{n,m})后面時耍属,匹配模式是非貪婪的托嚣。非貪婪模式盡可能少的匹配所搜索的字符串,而默認的貪婪模式則盡可能多的匹配所搜索的字符串厚骗。例如示启,對于字符串“oooo”,“o+?”將匹配單個“o”领舰,而“o+”將匹配所有“o”夫嗓。
. 匹配除“\n”之外的任何單個字符。要匹配包括“\n”在內的任何字符冲秽,請使用像“(.|\n)”的模式舍咖。
(pattern) 匹配pattern并獲取這一匹配的子字符串。該子字符串用于向后引用锉桑。要匹配圓括號字符谎仲,請使用“(”或“)”。
x|y 匹配x或y刨仑。例如郑诺,“z|food”能匹配“z”或“food”夹姥。“(z|f)ood”則匹配“zood”或“food”辙诞。
[xyz] 字符集合(character class)辙售。匹配所包含的任意一個字符。例如飞涂,“[abc]”可以匹配“plain”中的“a”旦部。其中特殊字符僅有反斜線\保持特殊含義,用于轉義字符较店。其它特殊字符如星號士八、加號、各種括號等均作為普通字符梁呈。脫字符^如果出現(xiàn)在首位則表示負值字符集合婚度;如果出現(xiàn)在字符串中間就僅作為普通字符。連字符 - 如果出現(xiàn)在字符串中間表示字符范圍描述官卡;如果如果出現(xiàn)在首位則僅作為普通字符蝗茁。
[^xyz] 排除型(negate)字符集合。匹配未列出的任意字符寻咒。例如哮翘,“[^abc]”可以匹配“plain”中的“plin”。
[a-z] 字符范圍毛秘。匹配指定范圍內的任意字符饭寺。例如,“[a-z]”可以匹配“a”到“z”范圍內的任意小寫字母字符叫挟。
[^a-z] 排除型的字符范圍艰匙。匹配任何不在指定范圍內的任意字符。例如霞揉,“[^a-z]”可以匹配任何不在“a”到“z”范圍內的任意字符旬薯。

2.grep模式匹配命令

grep命令用于打印輸出文本中匹配的模式串晰骑,它使用正則表達式作為模式匹配的條件适秩。

參數(shù) 說明
-b 將二進制文件作為文本來進行匹配
-c 統(tǒng)計以模式匹配的數(shù)目
-i 忽略大小寫
-n 顯示匹配文本所在行的行號
-v 反選,輸出不匹配行的內容
-r 遞歸匹配查找
-A n n為正整數(shù)硕舆,表示after的意思秽荞,除了列出匹配行之外,還列出后面的n行
-B n n為正整數(shù)抚官,表示before的意思扬跋,除了列出匹配行之外,還列出前面的n行
--color=auto 將輸出中的匹配項設置為自動顏色顯示

3.使用正則表達式

  • 數(shù)量
# 將匹配以'z'開頭以'o'結尾的所有字符串
$ echo 'zero\nzo\nzoo' | grep 'z.*o'
# 將匹配以'z'開頭以'o'結尾凌节,中間包含一個任意字符的字符串
$ echo 'zero\nzo\nzoo' | grep 'z.o'
# 將匹配以'z'開頭,以任意多個'o'結尾的字符串
$ echo 'zero\nzo\nzoo' | grep 'zo*'
  • 選擇
# grep默認是區(qū)分大小寫的钦听,這里將匹配所有的小寫字母
$ echo '1234\nabcd' | grep '[a-z]'
# 將匹配所有的數(shù)字
$ echo '1234\nabcd' | grep '[0-9]'
# 將匹配所有的數(shù)字
$ echo '1234\nabcd' | grep '[[:digit:]]'
# 將匹配所有的小寫字母
$ echo '1234\nabcd' | grep '[[:lower:]]'
# 將匹配所有的大寫字母
$ echo '1234\nabcd' | grep '[[:upper:]]'
# 將匹配所有的字母和數(shù)字洒试,包括0-9,a-z,A-Z
$ echo '1234\nabcd' | grep '[[:alnum:]]'
# 將匹配所有的字母
$ echo '1234\nabcd' | grep '[[:alpha:]]'

下面包含完整的特殊符號及說明:

特殊符號 說明
[:alnum:] 代表英文大小寫字節(jié)及數(shù)字,亦即 0-9, A-Z, a-z
[:alpha:] 代表任何英文大小寫字節(jié)朴上,亦即 A-Z, a-z
[:blank:] 代表空白鍵與 [Tab] 按鍵兩者
[:cntrl:] 代表鍵盤上面的控制按鍵垒棋,亦即包括 CR, LF, Tab, Del.. 等等
[:digit:] 代表數(shù)字而已,亦即 0-9
[:graph:] 除了空白字節(jié) (空白鍵與 [Tab] 按鍵) 外的其他所有按鍵
[:lower:] 代表小寫字節(jié)痪宰,亦即 a-z
[:print:] 代表任何可以被列印出來的字節(jié)
[:punct:] 代表標點符號 (punctuation symbol)叼架,亦即:" ' ? ! ; : # $...
[:upper:] 代表大寫字節(jié),亦即 A-Z
[:space:] 任何會產(chǎn)生空白的字節(jié)衣撬,包括空白鍵, [Tab], CR 等等
[:xdigit:] 代表 16 進位的數(shù)字類型乖订,因此包括: 0-9, A-F, a-f 的數(shù)字與字節(jié)

注意:之所以要使用特殊符號,是因為上面的[a-z]不是在所有情況下都管用具练,這還與主機當前的語系有關乍构,即設置在LANG環(huán)境變量的值,zh_CN.UTF-8的話[a-z]靠粪,即為所有小寫字母蜡吧,其它語系可能是大小寫交替的如,"a A b B...z Z"占键,[a-z]中就可能包含大寫字母昔善。所以在使用[a-z]時請確保當前語系的影響,使用[:lower:]則不會有這個問題畔乙。

4.sed流編輯器

sed 命令基本格式:

sed [參數(shù)]... [執(zhí)行命令] [輸入文件]...
# 形如:
$ sed -i '1s/sad/happy/' test # 表示將test文件中第一行的"sad"替換為"happy"
sed常用參數(shù)介紹
參數(shù) 說明
-n 安靜模式君仆,只打印受影響的行,默認打印輸入數(shù)據(jù)的全部內容
-e 用于在腳本中添加多個執(zhí)行命令一次執(zhí)行牲距,在命令行中執(zhí)行多個命令通常不需要加該參數(shù)
-f filename 指定執(zhí)行filename文件中的命令
-r 使用擴展正則表達式返咱,默認為標準正則表達式
-i 將直接修改輸入文件內容,而不是打印到標準輸出設備

sed執(zhí)行命令格式:

[n1][,n2]command
[n1][~step]command
# 其中一些命令可以在后面加上作用范圍牍鞠,形如:
$ sed -i 's/sad/happy/g' test # g表示全局范圍
$ sed -i 's/sad/happy/4' test # 4表示指定行中的第四個匹配字符串

其中n1,n2表示輸入內容的行號咖摹,它們之間為,逗號則表示從n1到n2行,如果為~波浪號則表示從n1開始以step為步進的所有行难述;command為執(zhí)行動作萤晴,下面為一些常用動作指令:

sed常用執(zhí)行命令
命令 說明
s 行內替換
c 整行替換
a 插入到指定行的后面
i 插入到指定行的前面
p 打印指定行,通常與-n參數(shù)配合使用
d 刪除指定行

sed操作舉例

打印指定行

# 打印2-5行
$ nl passwd | sed -n '2,5p'
# 打印奇數(shù)行
$ nl passwd | sed -n '1~2p'

行內替換

# 將輸入文本中"shiyanlou" 全局替換為"hehe",并只打印替換的那一行胁后,注意這里不能省略最后的"p"命令
$ sed -n 's/shiyanlou/hehe/gp' passwd

行間替換

$ nl passwd | grep "shiyanlou"
# 刪除第21行
$ sed -n '21c\www.shiyanlou.com' passwd
(這里我們只把要刪的行打印出來了店读,并沒有真正的刪除,如果要刪除的話攀芯,請使用-i參數(shù))
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末屯断,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌殖演,老刑警劉巖氧秘,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異趴久,居然都是意外死亡敏储,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門朋鞍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來已添,“玉大人,你說我怎么就攤上這事滥酥「瑁” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵坎吻,是天一觀的道長缆蝉。 經(jīng)常有香客問我,道長瘦真,這世上最難降的妖魔是什么刊头? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮诸尽,結果婚禮上原杂,老公的妹妹穿的比我還像新娘。我一直安慰自己您机,他們只是感情好穿肄,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著际看,像睡著了一般咸产。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上仲闽,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天脑溢,我揣著相機與錄音,去河邊找鬼赖欣。 笑死屑彻,一個胖子當著我的面吹牛,可吹牛的內容都是我干的畏鼓。 我是一名探鬼主播酱酬,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼壶谒,長吁一口氣:“原來是場噩夢啊……” “哼云矫!你這毒婦竟也來了?” 一聲冷哼從身側響起汗菜,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤让禀,失蹤者是張志新(化名)和其女友劉穎挑社,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體巡揍,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡痛阻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了腮敌。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阱当。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖糜工,靈堂內的尸體忽然破棺而出弊添,到底是詐尸還是另有隱情,我是刑警寧澤捌木,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布油坝,位于F島的核電站,受9級特大地震影響刨裆,放射性物質發(fā)生泄漏澈圈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一帆啃、第九天 我趴在偏房一處隱蔽的房頂上張望瞬女。 院中可真熱鬧,春花似錦努潘、人聲如沸拆魏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽渤刃。三九已至,卻和暖如春贴膘,著一層夾襖步出監(jiān)牢的瞬間卖子,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工刑峡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留洋闽,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓突梦,卻偏偏與公主長得像诫舅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子宫患,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內容

  • 本文筆記源自這里——[實驗樓]歡迎大家在下面交流其中有問題的地方喜歡請點收藏刊懈,每日更新(全部已親自實踐). 一. ...
    東皇Amrzs閱讀 3,989評論 7 54
  • 基礎命令 主要的命令和快捷鍵 Linux系統(tǒng)命令由三部分組成:cmd + [options]+[operation...
    485b1aca799e閱讀 1,096評論 0 0
  • 概念 正則表達式,又稱正規(guī)表示式卷哩、正規(guī)表示法蛋辈、正規(guī)表達式、規(guī)則表達式将谊、常規(guī)表示法(英語:Regular Expre...
    dxldeng閱讀 2,487評論 0 2
  • .bat腳本基本命令語法 目錄 批處理的常見命令(未列舉的命令還比較多冷溶,請查閱幫助信息) 1、REM 和 :: 2...
    慶慶慶慶慶閱讀 8,097評論 1 19
  • 正則表達式 關于正則表達式相信很多學計算機的人都聽說過 尤其是做編程行業(yè)的人 那什么是正則表達式 正則表達式尊浓,又稱...
    數(shù)據(jù)革命閱讀 897評論 0 1