繼上一篇對正規表達式以及linux三劍客grep的講解後,這一篇對sed重點介紹。
一、sed簡介
sed表示流編輯器(Stream Editor)。這是一個簡單但功能強大的工具,分析文本,并無縫地轉換它。 sed是在1973-1974年由貝爾實驗室的李E. McMahon開發。如今,它運作在所有主要的作業系統。
McMahon編寫了一個通用的面向行的編輯器,它最終成為sed。sed借用文法和ed編輯許多有用的功能。自成立開始,就對正規表達式有所支援。sed接受來自檔案以及管道的輸入。此外,它也可以接受來自标準輸入的資料流的輸入。
sed是自由軟體由基金會(FSF)維護,它是由GNU/ Linux分發。是以,它通常被稱為GNU sed的。對于新手使用者,sed文法看起來神秘。但是,一旦熟悉了它的文法,就可以使用sed的幾行腳本解決許多複雜的任務。
二、sed的工作流程
它一次處理一行内容。處理時,把目前處理的行存儲在臨時緩沖區中,稱為“模式空間”,接着用sed指令處理緩沖區中的内容, 處理完成後,把緩沖區的内容送往螢幕。然後讀入下行,執行下一個循環。如果沒有使諸如‘D’的特殊指令,那會在兩個循環之間清空模式空間,但不會清空保留白間(處理的檔案)。這樣不斷重複,直到檔案末尾。檔案内容并沒有改變,除非你使用重定向存儲輸出。
下面會有舉例對執行流程具體說明
三、sed典型用途
sed可以有許多不同的方式使用,例如:
文本替換
選擇性列印的文本檔案
一個就地文本檔案的編輯
文本檔案的非互動式的編輯等等。
四、sed工具
1、功能:
主要用來自動編輯一個或多個檔案,簡化對檔案的反複操作,編寫轉換程式等
參考位址
2、文法:
sed[option]... 'script' inputfile...
3、常用選項:
-n:不輸出模式空間内容到螢幕,即不自動列印
-e: 多點編輯
-f:/PATH/SCRIPT_FILE: 從指定檔案中讀取編輯腳本 這裡的編輯腳本每行一個不需要帶引号
-r: 支援使用擴充正規表達式 regexp-extended
-i.bak: 備份檔案并原處編輯
4、script(腳本):
5、位址定界:
() 不給位址:對全文進行處理
() 單位址:
#: 指定的行
/pattern/:被此處模式所能夠比對到的每一行
() 位址範圍:
#,# 從哪行開始到哪行結束
#,+#
/pat1/,/pat2/
#,/pat1/
() ~:步進
first~step
first 指起始比對行, step 指步長
舉例:
~ 奇數行
~ 偶數行
6、編輯指令:
d: 删除模式空間比對的行,并立即啟用下一輪循環
p:列印目前模式空間内容,追加到預設輸出之後
a [\]text:在指定行後面追加文本
支援使用\n實作多行追加
i[\]text:在行前面插入文本
c [\]text:替換行為單行或多行文本
w /path/somefile: 儲存模式比對的行至指定檔案
r /path/somefile:讀取指定檔案的文本至模式空間中
比對到的行後:
=: 為模式空間中的行列印行号
!:模式空間中比對行取反處理
s///:查找替換,支援使用其它分隔符,[email protected]@@,s###
替換标記:
g: 行内全局替換
p: 顯示替換成功的行
w /PATH/TO/SOMEFILE:将替換成功的行儲存至檔案中
五、sed工具使用執行個體:
~]# sed -n '1p' passwd #隻列印第一行
~]# ifconfig eth1 |sed -n p #列印網卡那一行的ip位址
~]# seq |sed -n '1~2p' #步進,隻顯示奇數行
~]# seq |sed -n '2~2p' #步進,隻顯示偶數行
~]# sed -i.orig 's/dog/cat/g' pets #備份後再替換
~]# sed '2a\dog cat dog cat cat' pets #在第二行後增加新行
~]# sed '2i\dog cat dog cat cat' pets #在第二行前增加新行
~]# sed '2c\dog cat dog cat cat' pets #替換第二行
~]# sed '2w /path/filename' pets #将第二行儲存到指定檔案
~]# sed '2r /path/filename' pets #将指定檔案讀取并加到第二行後
~]# sed '=' pets #在顯示的結果前顯示行号
六、sed的模式空間和保持空間
sed之是以能以行為機關的編輯或修改文本,其原因在于它使用了兩個空間:一個是活動的“模式空間(pattern space)”,另一個是起輔助作用的“保持空間(hold space)這2個空間的使用。
模式空間:可以想成工程裡面的流水線,資料之間在它上面進行處理。
保持空間:可以想象成倉庫,我們在進行資料處理的時候,作為資料的暫存區域。
正常情況下,如果不顯示使用某些進階指令,保持空間不會使用到!
sed在正常情況下,将處理的行讀入模式空間,腳本中的“sed command(sed指令)”就一條接着一條進行處理,直到腳本執行完畢。然後該行被輸出,模式被清空;接着,在重複執行剛才的動作,檔案中的新的一行被讀入,直到檔案處理完畢。
一般情況下,資料的處理隻使用模式空間(pattern space),按照如上的邏輯即可完成主要任務。但是某些時候,通過使用保持空間(hold space),還可以帶來意想不到的效果。
1、進階編輯指令選項:
P:列印模式空間開端至\n内容,并追加到預設輸出之前
h: 把模式空間中的内容覆寫至保持空間中
H:把模式空間中的内容追加至保持空間中
g: 從保持空間取出資料覆寫至模式空間
G:從保持空間取出内容追加至模式空間
x: 把模式空間中的内容與保持空間中的内容進行互換
n: 讀取比對到的行的下一行覆寫至模式空間
N:讀取比對到的行的下一行追加至模式空間
d: 删除模式空間中的行
D:如果模式空間包含換行符,則删除直到第一個換行符的模式空間中的文本,并不會讀取新的輸入行,而使用合成的模式空間重新啟動循環。如果模式空間不包含換行符,則會像發出d指令那樣啟動正常的新循環
2、進階編輯舉例:
~]# sed -n 'n;p' FILE
#顯示偶數行
~]# sed '1!G;h;$!d' FILE
#逆向顯示檔案内容
~]# sed 'N;D' FILE
#僅顯示最後一行
~]# sed '$!N;$!D' FILE
#僅顯示檔案最後兩行
~]# sed '$!d' FILE
#僅保留最後一行
~]# sed ‘G’ FILE
#每行後加一個空行
~]# sed ‘g’ FILE
#将每行内容替換為空行
~]# sed ‘/^$/d;G’ FILE
#每行後加一個空行,已有空白行的,僅顯示一個空白行
~]# sed 'n;d' FILE
#顯示奇數行
~]# sed -n '1!G;h;$p' FILE
#逆向顯示檔案内容
3、對具體執行個體實作原理圖解說明
~]# sed '1!G;h;$!d' FILE.txt
#逆序顯示
注意:sed對于腳本中輸入的指令非常挑剔,在指令的末尾不能有任何空白或文本,如果在一行中有多個指令,要用分号分隔。
對各指令先複習一下吧!
!: 第一行除外
G: 把保持空間的内容讀取回來追加至模式空間
h: 把模式空間的内容覆寫儲存至保持空間
$!: 最後一行除外
d: 把空間的内容都删除
對FILE.txt的執行結果進行梳理
)
通過對三行整個流程的解析可以知道整個顯示出來的結果是逆序,非常神奇。
未來還會有更加好用的工具,用進階編輯指令在生産中不多的。