每次都要google怎麼用sed,因為本人實在記不住那些符號的意思。索性總結一下一些用法,節省搜尋時間。
1. 什麼是sed
sed是一種改進的,非互動編輯器。使用者可以用命令實現vi的所有編輯功能。sed不會改變檔案內容,
而是把結果輸出到螢幕。
2. sed和Regex
和grep一樣,sed也支援正則表示式。grep所支援的metacharacter,sed均支援。
3. 一些重要的command
(1) p: 輸出命令。 比如sed '/love/p' 將輸出全部的文本,並且符合love的行將被輸出2次數。
(2) n: 抑制sed的預設行為,比如上例中,就是因為sed預設輸出行, 而命令p又輸出行。sed -n '/love/p' 將輸出包含love的所有行而沒有重複。
(3) d: 刪除命令。 刪除某行,比如sed '3d' 刪除第三行並預設輸出其它行。
sed '3,$d' 刪除3行至末行內容,','表示範圍。
(4) s: 替換命令。 替換字串, 比如sed 's/love/hate/g' filename > filename.back. 將替換filename檔案中的
love字串為hate。
又如:sed 's/[0–9][0–9]$/&.5/' datafile 在檔案中尋找以2為數字結尾的行,並在這2位元字後面.5,&表示Regex所匹配出的串。
又如:sed 's#3#88#g' datafile 任何在s後面的符號都被視作替代'/'而成為新的分界符。
(5) ,: 確定選擇範圍。比如:sed -n '/west/,/east/p' datafile 在檔案中首先匹配west, 匹配到就開始輸出行直至匹配到east為止,注意Regex可以是數字(標誌行),可以是 字元組合,也可以是混合。sed -n '/west/, /&/p' datafile 首先匹配west,輸出行,直到最後一行為止。
(6) -e: 編輯命令:用於串連多個sed編輯命令
比如說:sed -e '1,3d' -e 's/love/gloom/g' datafile :首先刪除1至3行,然後全文替換love為gloom。
但有一點需要注意:前一個命令的輸出會影響後一個命令。他們是順序執行的。
(7) r: 讀檔案命令:允許sed載入特定檔案的內容到當前行的下一行。
比如說:sed '/Susan/r tmpfile' currentfile: 在currentfile中匹配Susan,一旦匹配上,則在下一行
載入tmpfile的內容,如果Susan在currentfile中出現多次,則tmpfile將被載入多次。
(8) w: 寫檔案命令:允許sed將匹配出的行寫到新檔案中
比如說:sed -n '/north/w tmpfile' currentfile:在currentfile中匹配north,一旦匹配到就吧
所在行寫到tmpfile中。
(9) a: 行追加命令:追加一行資訊到當前行的下一行。在TC shell中,必須有個\在a之後,第一個a是sed所要求的,表示命令尚未結束,轉下一行。 所替換的文本必須單獨放在一行。比如: sed '/^love /a\Hello World!' datafile 在datafile中匹配以love 開頭的行,並在此行後面加入一行文本Hello World!
(10) i: 行插入命令:如上,但不同的是在匹配行之前插入一行新文本。
(11) c: 行替換命令:如上,但不同的是用一行新文本替換匹配出的行。
(12) n: 讀取下一行:讀取匹配行的下一行,並進行處理。
sed '/^love /{n; s/is/was/;}' datafile: 搜尋datafile,匹配出以love 開頭的行,讀取匹配行的下一行
並用新的sed命令 s/is/was 處理,直到最後一行。
(13) y: 轉換命令:定義字元轉換的映射關係,並根據映射關係一一進行轉換。
比如:sed '1,5y/abcdefg/ABCDEFG/' datafile:根據給定的映射關係,將1-5行的a,b,c,d,e,f,g字母轉化為大寫。
(14) q: 退出命令:通知sed停止處理行,並退出。
比如:sed '5q' datafile: sed 預設輸出前5行,隨之退出。
又比如:sed '/Lewis/{s/Lewis/Joseph/;q;}' datafile: 首先匹配出Lewis,而後替換Lewis為Joseph,並立刻退出。
(15) h & g: 儲存和提取命令: sed運行時,會維護一個額外的holding buffer用於儲存行,h命令將pattern buffer中的內容 賦值到holding buffer中,g命令則從holding buffer中提取行並處理。比如:sed -e '/love/h' -e '$g' datafile: 在datafile中搜尋love, 將匹配行儲存到holding buffer中,處理到最後一行時,從holding buffer中讀取行資料,並預設輸出。
(16) h & x: 儲存和替換命令:h功能如上,x將用holding buffer中的行資料替代當前正在處理的行(pattern buffer中的資料)。
3. sed指令碼
可以將一系列的sed命令寫在一個指令檔中,運行時用命令 sed -f shellfile datafile,則sed會順序讀取datafile中的
每一行,並用shellfile中的命令處理這一行,直到datafile中的所有行都被處理完成。
需要注意的是:在每個命令後面不能有空格,否則會報錯。