sed編輯器被稱作流編輯器(stream editor),流編輯器會在編輯器處理資料之前基於預先提供的一組規則來編輯資料流。
sed編輯器可以根據命令來處理資料流中的資料,這些命令要麼從命令列中輸入,要麼儲存在乙個命令文字檔案中,並且sed支援正規表示式和擴充套件正規表示式的使用,這也大大提公升了其的實用性,使其成為了當今的linux文字處理三劍客。
sed編輯器的工作流程總結如下
(1)從輸入文字中讀取一行資料到模式空間(pattern space)
(2)在模式空間中根據所提供命令對資料進行匹配
(3)按照命令對資料進行修改
(4)將處理完資料進行輸出,在讀取下一行資料,如此反覆,直至完成全部資料行的處理
通過上圖可以看到,sed編輯器中還會有一保持空間,其實在日常的使用中,基本的sed語法就能滿足大部分的需求,也就牽扯不到保持空間(hold space)的使用,所以一般都不做討論,但是關於sed的高階用法,就需要保持空間的支援了,其可以使得指令碼**更加簡潔,甚至會有許多的其妙的用法,下面就對sed的高階編輯命名進行介紹。
(1)h/h
h: 把模式空間中的內容覆蓋至保持空間中
h:把模式空間中的內容追加至保持空間中
g: 從保持空間取出資料覆蓋至模式空間
g:從保持空間取出內容追加至模式空間
x: 把模式空間中的內容與保持空間中的內容進行互換
n: 讀取匹配到的行的下一行覆蓋至模式空間
d: 刪除模式空間中的行
d:如果模式空間包含換行符,則刪除直到第乙個換行符的模式空間中的文字, 並不會讀取新的輸入行,而使用合成的模式空間重新啟動迴圈。如果模式空間不包含換行符,則會像發出d命令那樣啟動正常的新迴圈
(6)p:列印模式空間開端至\n內容,並追加到預設輸出之前
其實單一的命令是很好理解的,但難於其組合起來之後的使用,只用對命令有了充分的理解,才能看透多條命令組合所產生的作用。下面我們通過分析幾個簡單組合命令例項進行練習
(1)sed -n 『n;p』 file
[root@centos6 ~]#seq 10 |sed -n 'n;p'24
6810
由於是初步接觸,為了易於理解,我們先模擬出命令執行,再由結果分析其執行過程。通過觀察結果,我們發現其輸出的結果是:只輸出偶數行!
下面分析其執行流程:
1.讀取第一行資料到模式空間中
2.(由於n命令)將第二行資料覆蓋至模式空間中
3.(由於p命令)輸出並清空模式空間內容
4.(由於-n命令)不進行預設輸出,讀取第三行到模式空間中
這就完成了一次完整的命令流程,直至讀取完最後一行,就完成了偶數行輸出的效果。
(2)sed 『1!g;h;$!d』 file
[root@centos6 ~]#seq 10 |sed '1!g;h;$!d'
這次我們來執行乙個較複雜的例子,來試著分析其作用
1.讀取第一行資料到模式空間中
2.(由於1!g命令)命令作用範圍為非第一行,對本次操作無效,暫時忽略
3.(由於h命令)將模式空間內第一行內容覆蓋至保持空間中
4.(由於$!d命令)刪除模式空間中內容,導致沒有預設輸出
5.讀取第二行資料到模式空間中
6.(由於1!g命令)符合限制條件,將保持空間內第一行資料追加到模式空間內第二行之後
7.(由於h命令)將模式空間內第二行和第一行內容覆蓋至保持空間中
如此反覆知道最後一行,不再刪除模式空間內內容,完成預設輸出。
通過分析,最終的結果應為倒序輸出文字,下面我們驗證一下結果
[root@centos6 ~]#seq 10 |sed '1!g;h;$!d'109
8765
4321
發現分析結果正確。
通過兩個分析例項,我們基本掌握了sed高階編輯命令的使用方法,重點在於日後的加以練習及其運用。
sed編輯命令
sed的編輯命令 sed command p列印匹配行 和 n選項一起合用 顯示檔案行號 a 在定位行號後附加新文字資訊 i 在定位行號後插入新文字資訊 d刪除定位行 c 用新文字替換定位文字 w filename 寫文字到乙個檔案,類似輸出重定向 r filename 從另乙個檔案中讀文字,類似輸...
高階Sed命令 N
n next 追加下一行 通過讀取新的輸入行,並將它新增到模式空間的現有內容之後來建立多行模式空間 模式空間最初的內容和新的輸入行用換行符 n 分隔 在模式空間中,元字元 只匹配模式空間中的第乙個元字元,而不匹配換行符後買呢的字元 同樣 只匹配模式空間中最後的換行符 next 輸出模式空間的內容,然...
sed 流編輯命令
sed 1,2d hosts 刪除第一行第二行 原檔案不變 sed i 1,2d hosts sed d hosts 刪除最後一行 sed s local local g hosts local 替換成 local sed 1 i000000 hosts key i上一行新增str sed 1 a0...