天天看點

Linux上文本三劍客之二sed

繼上一篇對正規表達式以及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的執行結果進行梳理

Linux上文本三劍客之二sed
Linux上文本三劍客之二sed
Linux上文本三劍客之二sed
Linux上文本三劍客之二sed
Linux上文本三劍客之二sed
Linux上文本三劍客之二sed
Linux上文本三劍客之二sed
Linux上文本三劍客之二sed
Linux上文本三劍客之二sed
Linux上文本三劍客之二sed
Linux上文本三劍客之二sed
Linux上文本三劍客之二sed

)

Linux上文本三劍客之二sed
Linux上文本三劍客之二sed

通過對三行整個流程的解析可以知道整個顯示出來的結果是逆序,非常神奇。

未來還會有更加好用的工具,用進階編輯指令在生産中不多的。

繼續閱讀