sed是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩沖區中,接着用sed命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕。
然后讀入下一行,執行下一個循環。這樣不斷重復,直到文件最后。文件內容並沒有改變,除非使用重定向存儲輸出。
sed語法:sed [option]……'script' inputfile……
常用選項:
-n #不輸出模式空間內容到屏幕,即不自動打印到屏幕
-e #多點編輯
-f /PATH/SCRIPT_FILE #從指定文件中讀取編輯腳本
-r #支持擴展的正則表達式
-i.bak #備份文件並原處編輯,.bak可以自定義
一、script,地址命令
地址定界:
1、不給地址,則對全文進行處理
2、單地址:n:指定的行,$:最后一行
/pattern/:被此處模式所能匹配到的每一行
3、地址范圍
n1,n2 #意思為文本的n1行到n2行
n,+m #意思為顯示n行,以及其后面的m行
/pat1/,/part2/ #從匹配到pat1的行到part2的行
n,/pat1/ #從n行開始,到pat1行結束
4、~:步進
1~2 #奇數行
2~2 #偶數行
舉例:打印指定行的內容到屏幕
執行命令:sed -n 'p' fstab #后面的p是指將匹配到前面的地址的內容打印到屏幕,這里前面的地址范圍為空,則表示匹配文件所有的行
執行命令:sed -n '2,3p' fstab #只打印第2行到第3行的內容到屏幕
執行命令: sed -n '6,$p' fstab #只打印出第6行到文本最后一行得內容
執行命令:sed -n '/^#/p' fstab #匹配/ /中的模式,打印出以#開頭的行
執行命令:sed -n '2,/\/dev\/disk/p' fstab #打印第二行到包含/dev/disk的行的所有內容
執行命令:sed -n '/\/etc\/fstab/,/xfs/p' fstab #打印出從包含/etc/fstab的行到包含xfs的行的內容
執行命令:sed -n '1~2p' fstab #打印出文檔中的奇數行
執行命令:sed -n '2~2p' fstab #打印出文本的偶數行
二、sed的編輯命令
d #刪除模式空間匹配的行,並開啟下一輪循環
p #打印出模式匹配的行,追加到默認輸出的后面
a [\]text #在指定的行后面追加一行,支持使用\n追加多行
i [\]text #在指定的行前面追加一行,支持使用\n追加多行
c [\]text #替換行為單行或多行文本
w /path/file #保存模式匹配的行至指定文件
r /path/file #讀取指定文件的文本至模式空間中匹配到的行的行后
= #為模式空間中的行打印行號
! #模式空間中匹配行取反處理
舉例:打印出除/dev/mapper所在行的所有行
執行命令:sed -n '/\/dev\/mapper/d;p' fstab #刪除模式匹配到的行,然后打印出來,中間;表示執行完第一個命令后執行第二個命令
執行命令:sed '3p' fstab #沒有加n意思為打印出所以的文本,將第三行的內容追加到第三行后面
執行命令:sed '/^UUID/a\this is a test' fstab #在UUID后面追加一行文本,this is a test
執行命令:sed '/^UUID/i\this is a test' fstab #在匹配的行的前面追加一行文本
執行命令:sed '/^UUID/c\this is a test\na test' fstab #將匹配到的行替換為指定的文本內容,\n意為換行
執行命令:sed -n '/^UUID/w/root/fstab1' fstab
執行命令:sed '/UUID/r/root/zhuijia' fstab #將/root/zhuijia中的內容追加到匹配到的行的后面
執行命令:sed -n '/UUID/=' fstab #打印出含有該字符的行的行號
執行命令:sed -n '/UUID/!p' fstab #打印除匹配到的行以外的所有的行
三、sed工具
s/// #查找替換,支持使用s@@@或者s###
g #行內全局替換
p #顯示替換成功的行
w /path/file #將替換成功的行保存至文件中
舉例:將fstab文件中的#全部去掉,然后打印出來
執行命令:sed -nr 's/# *//g;p' fstab #將所有的#且后面至少有一個空格的內容替換成無,然后選擇所有行,並打印出來
舉例:取出UUID=后面的那一串數字,並打印出來
執行命令:sed -nr 's/UUID=(*) \/boot*/\1/p' fstab #利用正則的分組,將等號后面的內容取出並打印
四、sed高級應用
P #打印模式空間開端至\n內容(即模式空間第一行內容),並追加到默認輸出之前
h #把模式空間中的內容覆蓋至保持空間中
H #把模式空間中的內容追加至保持空間中
g #從保持空間取出數據覆蓋至模式空間
G #從保持空間取出內容追加至模式空間
x #把模式空間中的內容與保持空間中的內容進行互換
n #讀取匹配到的行的下一行覆蓋至模式空間
N #讀取匹配到的行的下一行追加至模式空間
d #刪除模式空間中的行
D #如果模式空間包含換行符,則刪除直到第一個換行符的模式空間中的文本,並不會讀取新的輸入行,而使
用合成的模式空間重新啟動循環。如模式空間不包含換行符,則會像發出d命令那樣啟動正常的新的循環。
保持空間:即在sed處理數據時,數據的一個暫存空間,sed默認是處理完一行的數據后,就清空模式空間的內容,繼續進行下一一行的數據處理,保持空間則能暫時的存放數據。
舉例:打印文本的偶數行內容
執行命令:sed -n 'n;p' num
sed的處理過程:
sed第一次取數據到模式空間時,因為有n參數,所以sed就把第二行的數據取出並覆蓋到模式空間中,此時模式空間就只有第二行數據,然后執行p操作打印
sed第二次取數據時,由於第二行數據已經取過了,所以從第三行開始取,取的時候,仍然受到n參數影響,所以sed把第四行的數據取出放到了模式空間中,並打印。
sed的后續也是按照上面的那種方法取出數據,所以sed取出的數據應該依次為:第二行數據、第四行數據、第六行數據……即文本的所有偶數行,然后通過p選項打印到屏幕
舉例:倒序顯示文本內容
執行命令:sed '1!G;h;$!d' num
sed工作過程:
sed第一次取數據:運行1!G時,由於是第一行,所以不需要執行G操作,然后在執行h操作,即將第一行數據覆蓋到保持空間中,然后刪除模式空間中的行。
此時模式空間中為空,保持空間中為第一行數據
sed第二次取數據:由於是非首行,執行G操作,將保持空間中的第一行取出追加到模式空間的的第二行的后面,再執行h操作,將第一行第二行復制到保
持空間中,並刪除模式空間的內容,此時模式空間為空,保持數據為第二行和第一行
如上執行過程,直到遇到了最后一行,將保持空間中的數據第9、8、、6、5、4、3、2、1行追加到模式空間中,由於是最后一行,不執行d動作,此時的
模式空間中數據為:第10、9、8、7、6、5、4、3、2、1行,由於sed默認打印出所有處理過的行,而之前的操作模式空間都為空,所以不打印,到了最
后一行,將模式空間中的數據打印出來。
舉例:打印出文本的最后一行
執行命令:sed 'N;D' num
sed工作過程:
sed第一次取數據:讀取第一行,然后執行N操作,將第二行的數據追加到模式空間,而后執行D操作,由於模式空間中有換行符,刪除模式空間的第一行,即
模式空間中的數據為第二行。
sed第二次取數據:讀取第由於第二行已經被取過了,這里取第三行,同上刪除第一行,模式空間中的數據為第四行
在此合成的模式空間啟動循環,直至再也沒有新的行讀入,模式空間中就只有最后一行數據。然后打印到屏幕。