sed是一個非交互性性文本編輯器, 它編輯文件或標準輸入導出的文件拷貝。標準輸入多是來自鍵盤、文件重定向、字符串或變量,或者是一個管道文件。sed能夠隨意編輯小或大的文件,有許多 sed命令用來編輯、刪除,並容許作這項工做時不在現場。sed一次性處理全部改變,於是變得頗有效,對用戶來講,最重要的是節省了時間。sed必須經過行號和正則表達式指定要改變的文本行 sed怎樣讀取數據: sed從文件的一個文本行或從標準輸入的幾種格式中讀取數據,將之拷貝到一個編輯緩衝區,而後讀命令行或腳本的第一條命令,並使用這些命令查找模式或定位行號編輯它,重複過程直到命令結束 sed命令的調用: 在命令行鍵入命令;將sed命令插入腳本文件,而後調用sed;將sed命令插入腳本文件,並使sed腳本可執行 sed [option] sed命令 輸入文件 在命令行使用sed命令,實際命令要加單引號 sed [option] -f sed腳本文件 輸入文件 使用sed腳本文件 sed腳本文件 [option] 輸入文件 第一行具備sed命令解釋器的sed腳本文件 option以下: n 不打印; sed不寫編輯行到標準輸出,缺省爲打印全部行(編輯和未編輯),p命令能夠用來打印編輯行 c 下一命令是編輯命令,使用多項編輯時加入此選項 f 若是正在調用sed腳本文件,使用此選項,此選項通知sed一個腳本文件支持所用的sed命令,如 sed -f myscript.sed input_file 這裏myscript.sed即爲支持sed命令的文件 使用重定向文件便可保存sed的輸出 使用sed在文本中定位文本的方式: x x爲一行號,好比1 x,y 表示行號範圍從x到y,如2,5表示從第2行到第5行 /pattern/ 查詢包含模式的行,如/disk/或/[a-z]/
/pattern/pattern/ 查詢包含兩個模式的行,如/disk/disks/
/pattern/,x 在給定行號上查詢包含模式的行,如/disk/,3 x,/pattern/ 經過行號和模式查詢匹配行,如 3,/disk/ x,y! 查詢不包含指定行號x和y的行 基本sed編輯命令: p 打印匹配行 c/ 用新文本替換定位文本 = 顯示文件行號 s 使用替換模式替換相應模式 a/ 在定位行號後附加新文本信息 r 從另外一個文本中讀文本 i/ 在定位行號後插入新文本信息 w 寫文本到一個文件 d 刪除定位行 q 第一個模式匹配完成後退出或當即退出 l 顯示與八進制ASCII代碼等價的控制字符 y 傳送字符 n 從另外一個文本中讀文本下一行,並附加在下一行 {} 在定位行執行的命令組 g 將模式2粘貼到/pattern n/ 基本sed編程舉例: 使用p(rint)顯示行: sed -n '2p' temp.txt 只顯示第2行,使用選項n 打印範圍: sed -n '1,3p' temp.txt 打印第1行到第3行 打印模式: sed -n '/movie/'p temp.txt 打印含movie的行 使用模式和行號查詢: sed -n '3,/movie/'p temp.txt 只在第3行查找movie並打印 顯示整個文件: sed -n '1,$'p temp.txt $爲最後一行 任意字符: sed -n '/.*ing/'p temp.txt 注意是.*ing,而不是*ing 打印行號: sed -e '/music/=' temp.txt 附加文本:(建立sed腳本文件)chmod u+x script.sed,運行時./script.sed temp.txt #!/bin/sed -f /name1/ a/ #a/表示此處換行添加文本 HERE ADD NEW LINE. #添加的文本內容 插入文本: /name1/ a/ 改爲 4 i/ 4表示行號,i插入 修改文本: /name1/ a/ 改爲 /name1/ c/ 將修改整行,c修改 刪除文本: sed '1d' temp.txt 或者 sed '1,4d' temp.txt 替換文本: sed 's/source/OKSTR/' temp.txt 將source替換成OKSTR sed 's//$//g' temp.txt 將文本中全部的$符號所有刪除 sed 's/source/OKSTR/w temp2.txt' temp.txt 將替換後的記錄寫入文件temp2.txt 替換修改字符串: sed 's/source/"ADD BEFORE" &/p' temp.txt 結果將在source字符串前面加上"ADD BEFORE",這裏的&表示找到的source字符並保存 sed結果寫入到文件: sed '1,2 w temp2.txt' temp.txt sed '/name/ w temp2.txt' temp.txt 從文件中讀文本: sed '/name/r temp2.txt' temp.txt 在每列最後加文本: sed 's/[0-9]*/& Pass/g' temp.txt 從shell向sed傳值: echo $NAME | sed "s/go/$REP/g" 注意須要使用雙引號 快速一行命令: 's//.$//g' 刪除以句點結尾行 '-e /abcd/d' 刪除包含abcd的行 's/[][][]*/[]/g' 刪除一個以上空格,用一個空格代替 's/^[][]*//g' 刪除行首空格 's//.[][]*/[]/g' 刪除句號後跟兩個或更多的空格,用一個空格代替 '/^$/d' 刪除空行 's/^.//g' 刪除第一個字符,區別 's//.//g'刪除全部的句點 's/COL/(.../)//g' 刪除緊跟COL的後三個字母 's/^////g' 刪除路徑中第一個/
///////////////////////////////////////////////////////////////////////
、使用句點匹配單字符 句點「.」能夠匹配任意單字符。「.」能夠匹配字符串頭,也能夠是中間任意字符。假定正在過濾一個文本文件,對於一個有1 0個字符的腳本集,要求前4個字符以後爲X C,匹配操做以下:. . . .X C. . . . 二、在行首以^匹配字符串或字符序列 ^只容許在一行的開始匹配字符或單詞。在行首第4個字符爲1,匹配操做表示爲:^ . . . 1
三、在行尾以$匹配字符串或字符 能夠說$與^正相反,它在行尾匹配字符串或字符, $符號放在匹配單詞後。若是在行尾匹配單詞j e t 0 1,操做以下:j e t 0 1 $ 若是隻返回包含一個字符的行,操做以下:^ . $ 四、使用*匹配字符串中的單字符或其重複序列 使用此特殊字符匹配任意字符或字符串的重複屢次表達式。 五、使用/屏蔽一個特殊字符的含義 有時須要查找一些字符或字符串,而它們包含了系統指定爲特殊字符的一個字符。若是要在正則表達式中匹配以* . p a s結尾的全部文件,可作以下操做:/ * / . p a s 六、使用[]匹配一個範圍或集合 使用[ ]匹配特定字符串或字符串集,能夠用逗號將括弧內要匹配的不一樣字符串分開,但並不強制要求這樣作(一些系統提倡在複雜的表達式中使用逗號),這樣作能夠增 加模式的可讀性。使用「 -」表示一個字符串範圍,代表字符串範圍從「 -」左邊字符開始,到「 -」右邊字符結束。假定要匹配任意一個數字,可使用:[ 0 1 2 3 4 5 6 7 8 9 ] 要匹配任意字母,則使用:[ A - Z a - z ]代表從A - Z、a - z的字母範圍。 七、使用/{/}匹配模式結果出現的次數 使用*可匹配全部匹配結果任意次,但若是隻要指定次數,就應使用/ { / },此模式有三種形式,即: pattern/{n/} 匹配模式出現n次。 pattern/{n,/} 匹配模式出現最少n次。 pattern/{n,m} 匹配模式出現n到m次之間,n , m爲0 - 2 5 5中任意整數。 匹配字母A出現兩次,並以B結尾,操做以下:A / { 2 / } B匹配值爲A A B 匹配A至少4次,使用:A / { 4 , / } B 在s h e l l編程中,一段好的腳本與完美的腳本間的差異之一,就是要熟知正則表達式並學會使用它們。相比較起來,用一個命令抽取一段文本比用三四個命令得出一樣的結果要節省許多時間。 ////////////////////////////////////////////////////////////////// 正則表達式使用詳解(一) 2000-04-26呂曉波 若是咱們問那些UNIX系統的愛好者他們最喜歡什麼,答案除了穩定 的系統和能夠遠程啓動以外,十有八九的人會提到正則表達式;若是咱們再問他們最頭痛的是什麼,可能除了複雜的進程控制和安裝過程以外,還會是正則表達式。 那麼正則表達式究竟是什麼?如何才能真正的掌握正則表達式並正確的加以靈活運用?本文將就此展開介紹,但願可以對那些渴望瞭解和掌握正則表達式的讀者有所 助益。 入門簡介 簡單的說,正則表達式是一種能夠用於模式匹配和替換的強有力的工具。咱們能夠在幾乎所 有的基於UNIX系統的工具中找到正則表達式的身影,例如,vi編輯器,Perl或PHP腳本語言,以及awk或sed shell程序等。此外,象JavaScript這種客戶端的腳本語言也提供了對正則表達式的支持。因而可知,正則表達式已經超出了某種語言或某個系統的 侷限,成爲人們廣爲接受的概念和功能。 正則表達式可讓用戶經過使用一系列的特殊字符構建匹配模式,而後把匹配模式與數據文件、程序輸入以及WEB頁面的表單輸入等目標對象進行比較,根據比較對象中是否包含匹配模式,執行相應的程序。 舉例來講,正則表達式的一個最爲廣泛的應用就是用於驗證用戶在線輸入的郵件地址的格式是否正確。若是經過正則表達式驗證用戶郵件地址的格式正確,用戶所 填寫的表單信息將會被正常處理;反之,若是用戶輸入的郵件地址與正則表達的模式不匹配,將會彈出提示信息,要求用戶從新輸入正確的郵件地址。因而可知正則 表達式在WEB應用的邏輯判斷中具備舉足輕重的做用。 基本語法 在對正則表達式的功能和做用有了初步的瞭解以後,咱們就來具體看一下正則表達式的語法格式。 正則表達式的形式通常以下: /love/ 其中位於「/」定界符之間的部分就是將要在目標對象中進行匹配的模式。用戶只要把但願查找匹配對象的模式內容放入「/」定界符之間便可。爲了可以使用戶 更加靈活的定製模式內容,正則表達式提供了專門的「元字符」。所謂元字符就是指那些在正則表達式中具備特殊意義的專用字符,能夠用來規定其前導字符(即位 於元字符前面的字符)在目標對象中的出現模式。 較爲經常使用的元字符包括: 「+」, 「*」,以及 「?」。其中,「+」元字符規定其前導字符必須在目標對象中連續出現一次或屢次,「*」元字符規定其前導字符必須在目標對象中出現零次或連續屢次,而「?」元字符規定其前導對象必須在目標對象中連續出現零次或一次。 下面,就讓咱們來看一下正則表達式元字符的具體應用。 /fo+/ 由於上述正則表達式中包含「+」元字符,表示能夠與目標對象中的 「fool」, 「fo」, 或者 「football」等在字母f後面連續出現一個或多個字母o的字符串相匹配。 /eg*/ 由於上述正則表達式中包含「*」元字符,表示能夠與目標對象中的 「easy」, 「ego」, 或者 「egg」等在字母e後面連續出現零個或多個字母g的字符串相匹配。 /Wil?/ 由於上述正則表達式中包含「?」元字符,表示能夠與目標對象中的 「Win」, 或者 「Wilson」,等在字母i後面連續出現零個或一個字母l的字符串相匹配。 除了元字符以外,用戶還能夠精確指定模式在匹配對象中出現的頻率。例如, /jim{2,6}/ 上述正則表達式規定字符m能夠在匹配對象中連續出現2-6次,所以,上述正則表達式能夠同jimmy或jimmmmmy等字符串相匹配。 在對如何使用正則表達式有了初步瞭解以後,咱們來看一下其它幾個重要的元字符的使用方式。 /s:用於匹配單個空格符,包括tab鍵和換行符; /S:用於匹配除單個空格符以外的全部字符; /d:用於匹配從0到9的數字; /w:用於匹配字母,數字或下劃線字符; /W:用於匹配全部與/w不匹配的字符; . :用於匹配除換行符以外的全部字符。 (說明:咱們能夠把/s和/S以及/w和/W看做互爲逆運算) 下面,咱們就經過實例看一下如何在正則表達式中使用上述元字符。 //s+/
上述正則表達式能夠用於匹配目標對象中的一個或多個空格字符。 //d000/
若是咱們手中有一份複雜的財務報表,那麼咱們能夠經過上述正則表達式垂手可得的查找到全部總額達千元的款項。 除了咱們以上所介紹的元字符以外,正則表達式中還具備另一種較爲獨特的專用字符,即定位符。定位符用於規定匹配模式在目標對象中的出現位置。 較爲經常使用的定位符包括: 「^」, 「$」, 「/b」 以及 「/B」。其中,「^」定位符規定匹配模式必須出如今目標字符串的開頭,「$」定位符規定匹配模式必須出如今目標對象的結尾,/b定位符規定匹配模式必須 出如今目標字符串的開頭或結尾的兩個邊界之一,而「/B」定位符則規定匹配對象必須位於目標字符串的開頭和結尾兩個邊界以內,即匹配對象既不能做爲目標字 符串的開頭,也不能做爲目標字符串的結尾。一樣,咱們也能夠把「^」和「$」以及「/b」和「/B」看做是互爲逆運算的兩組定位符。舉例來講: /^hell/ 由於上述正則表達式中包含「^」定位符,因此能夠與目標對象中以 「hell」, 「hello」或 「hellhound」開頭的字符串相匹配。 /ar$/ 由於上述正則表達式中包含「$」定位符,因此能夠與目標對象中以 「car」, 「bar」或 「ar」 結尾的字符串相匹配。 //bbom/
由於上述正則表達式模式以「/b」定位符開頭,因此能夠與目標對象中以 「bomb」, 或 「bom」開頭的字符串相匹配。 /man/b/ 由於上述正則表達式模式以「/b」定位符結尾,因此能夠與目標對象中以 「human」, 「woman」或 「man」結尾的字符串相匹配。 爲了可以方便用戶更加靈活的設定匹配模式,正則表達式容許使用者在匹配模式中指定某一個範圍而不侷限於具體的字符。例如: /[A-Z]/ 上述正則表達式將會與從A到Z範圍內任何一個大寫字母相匹配。 /[a-z]/ 上述正則表達式將會與從a到z範圍內任何一個小寫字母相匹配。 /[0-9]/ 上述正則表達式將會與從0到9範圍內任何一個數字相匹配。 /([a-z][A-Z][0-9])+/ 上述正則表達式將會與任何由字母和數字組成的字符串,如 「aB0」 等相匹配。這裏須要提醒用戶注意的一點就是能夠在正則表達式中使用 「()」 把字符串組合在一塊兒。「()」符號包含的內容必須同時出如今目標對象中。所以,上述正則表達式將沒法與諸如 「abc」等的字符串匹配,由於「abc」中的最後一個字符爲字母而非數字。 若是咱們但願在正則表達式中實現相似編程邏輯中的「或」運算,在多個不一樣的模式中任選一個進行匹配的話,可使用管道符 「|」。例如: /to|too|2/ 上述正則表達式將會與目標對象中的 「to」, 「too」, 或 「2」 相匹配。 正則表達式中還有一個較爲經常使用的運算符,即否認符 「[^]」。與咱們前文所介紹的定位符 「^」 不一樣,否認符 「[^]」規定目標對象中不能存在模式中所規定的字符串。例如: /[^A-C]/ 上述字符串將會與目標對象中除A,B,和C以外的任何字符相匹配。通常來講,當「^」出如今 「[]」內時就被視作否認運算符;而當「^」位於「[]」以外,或沒有「[]」時,則應當被視作定位符。 最後,當用戶須要在正則表達式的模式中加入元字符,並查找其匹配對象時,可使用轉義符「/」。例如: /Th/*/ 上述正則表達式將會與目標對象中的「Th*」而非「The」等相匹配。