sed命令詳解


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第二次取數據:讀取第由於第二行已經被取過了,這里取第三行,同上刪除第一行,模式空間中的數據為第四行

在此合成的模式空間啟動循環,直至再也沒有新的行讀入,模式空間中就只有最后一行數據。然后打印到屏幕。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM