sed在處理文本時,會先讀取第一個輸入行,將編輯命令應用於輸入行,而後讀取下一個輸入行,並應用編輯命令。sed老是處理最新版本的行,所以sed中有多個編輯命令時,編輯命令的順序對結果會有影響,下一個編輯命令會發生了變化的行而不是原始行,如示例: 正則表達式
[root@fanyue sed]# cat test
1 This is a pig.
2 This is a cow.
[root@fanyue sed]# sed 's/pig/cow/; s/cow/horse/' test
1 This is a horse.
2 This is a horse.bash
能夠看到sed中第二個編輯命令處理的行是被第一個命令處理以後的內容。this
sed維護一種模式空間,即一個工做區或者臨時緩衝區,當使用編輯命令時將在模式空間中存儲單個輸入行。一次一行的設計的有點是在讀取很是龐大的文件時不會出現內存溢出或緩慢的問題。spa
初始時,模式空間包含有單個輸入行的備份。而後按照命令順序對模式空間的中的行進行處理。當應用了全部的指令後,當前行被輸出,下一行被讀入模式空間。而後腳本中的指令再次按順序應用於新的行。即sed的處理步驟爲:設計
回到上面的示例,若是我想將pig改成cow, cow改成horse改如何處理?code
[root@fanyue sed]# sed 's/cow/horse/; s/pig/cow/' test 1 This is a cow. 2 This is a horse.
將命令的順序反轉便可!blog
sed還維護了一個稱爲保持空間(hold space)的另外一個臨時緩衝區,保持空間能夠將模式空間的內容複製到保持空間並在之後檢索它們。內存
默認狀況下,sed將命令用於每個行。sed命令能夠指定0個,1個或2個地址。每一個地址都是一個描述模式、行號或者行尋址符號的正則表達式。class
例如,d命令表明刪除匹配的行,一個d命令會刪除全部的行,不會有任何輸出,如:test
[root@fanyue sed]# cat test 1 This is a pig. 2 This is a cow. 3 This is a dog. 4 And this is a monkey!!! [root@fanyue sed]# sed 'd' test
當行號全部地址提供時,則命令只會刪除匹配的那一行。例如,下面的示例只會刪除第一行:
[root@fanyue sed]# sed '1d' test 2 This is a cow. 3 This is a dog. 4 And this is a monkey!!!
行號指由sed維護的內部行數。該計數器不會由於多個輸入文件而重置。所以,無論指定多少個輸入文件,1只表明輸入流的第一行,若是輸入流是多個文件,那麼1表明第一個輸入文件的第一行。
一樣輸入流也只有一個最後的行。可使用尋址符號$指定。下面的示例刪除輸入的最後一行:
[root@fanyue sed]# sed '$d' test 1 This is a pig. 2 This is a cow. 3 This is a dog.
$符號不要和正則表達式中的$混淆,在正則表達式做爲地址提供時,這個命令隻影響與這個模式匹配的行。正則表達式必須封閉在斜槓(/)中。下面的刪除命令:
[root@fanyue sed]# sed '/!$/d' test 1 This is a pig. 2 This is a cow. 3 This is a dog.
只刪除以!結尾的行。
若是提供兩個地址,那麼就指定了命令執行的範圍。下面的示例展現了刪除兩個地址之間的全部行,兩個地址以逗號隔開:
[root@fanyue sed]# sed '/cow/,/monkey/d' test 1 This is a pig.
它刪除從一個模式匹配開始,到由第二種模式匹配的行(包括此行在內)爲止的全部行。下面的命令刪除了文件中從5行到最後一行的全部行:
[root@fanyue sed]# sed '5,$d' /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin
能夠混合使用行地址和模式地址:
1,/^$/d
sed沒有辦法先行判斷第二個地址是否存在匹配的行,所以當命令執行後sed會從一個匹配的行開始應用命令,若是沒有出現第二個匹配的行,那麼將刪除全部的行。
跟在地址後面的感嘆號會反轉匹配的意義:
[root@fanyue sed]# sed '1,2!d' test 1 This is a pig. 2 This is a cow.
sed使用大括號({})將一個地址嵌套在另外一個地址中,或者在相同的地址上應用多個命令。若是想指定行的範圍,而後在這個範圍內指定另外一個地址,則能夠嵌套地址。例如:
[root@fanyue sed]# cat test
This is a pig.
-------------
This is a cow.
-------------
this is a cat.-------------This is a dog.-------------And this is a monkey!!![root@fanyue sed]# sed '/cow/,/dog/ {/^$/d; s/-/*/g}' testThis is a pig.-------------This is a cow.*************this is a cat.*************This is a dog.-------------And this is a monkey!!!