sed的工作原理及使用

  1.sed的概念

      sed意爲流編輯器(Stream Editor),在Shell腳本和Makefile中作爲過濾器使用非常普遍,也就是把前一個程序的輸出引入sed的輸入,經過一系列編輯命令轉換爲另一種格式輸出。sed 是基於Basic模式的,sed和vi都源於早期UNIX的ed工具,所以很多sed命令和vi的末行命令是相同的。

   2.sed的工作原理

     sed 是一種在線編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩

衝區中,稱爲“模式空間”(pattern space),接着用sed命令處理緩衝區中的內容,處理

完成後,把緩衝區的內容送往屏幕。接着處理下一行,這樣不斷重複,直到文件末尾。文件

內容並沒有改變,除非你使用重定向存儲輸出。Sed主要用來自動編輯一個或多個文件;簡化

對文件的反覆操作。

   wKiom1dwiGCgTXtkAAA7A0-RzcY477.png-wh_50

3.sed的命令行格式

       sed命令行的基本格式爲:

           sed option 'script' file1 file2 ...

           sed option -f scriptfile file1 file2 ...

       sed處理的文件既可以由標準輸入重定向得到,也可以當命令行參數傳入,命令行參數可

以一次傳入多個文件,sed會依次處理。sed的編輯命令可以直接當命令行參數傳入,也可以寫

成一個腳本文件然後用-f參數指定,編輯命令的格式爲/pattern/action


    其中pattern是正則表達式,action是編輯操作。sed程序一行一行讀出待處理文件,如果某

一行 與pattern匹配,則執行相應的action,如果一條命令沒有pattern而只有action,這個

action將作用於待處理文件的每一行。

4.sed命令和選項

命令

a\ : 在當前行後添加一行或多行。多行時除最後一行外,每行末尾需用“\”續行

c\ : 用此符號後的新文本替換當前行中的文本。多行時除最後一行外,每行尾需

    用”\"續行

i\ :在當前行之前插入文本。多行時除最後一行外,每行末尾需用”\"續行d刪除     行

h : 把模式空間裏的內容複製到暫存緩衝區

H :把模式空間裏的內容追加到暫存緩衝區

g :把暫存緩衝區裏的內容複製到模式空間,覆蓋原有的內容

G:把暫存緩衝區的內容追加到模式空間裏,追加在原有內容的後面

l :列出非打印字符

p :打印行

n :讀入下一輸入行,並從下一條命令而不是第一條命令開始對其的處理

q :結束或退出sed

r :從文件中讀取輸入行

! :對所選行以外的所有行應用命令

s :用一個字符串替換另一個

g :在行內進行全局替換

w :將所選的行寫入文件

x :交換暫存緩衝區與模式空間的內容

y :將字符替換爲另一字符(不能對正則表達式使用y命令)

 注:紅色字體標註的是重點掌握的

選項

-e :進行多項編輯,即對輸入行應用多條sed命令時使用

-n :取消默認的輸出

-f :指定sed腳本的文件名

5.sed的基本使用

  1>/pattern/p:打印匹配pattern的行

    使用p命令需要注意,sed是把待處理文件的內容連同處理結果一起輸出到標準輸出的,

因此p命令表示除了把文件內容打印出來之外還額外打印一遍匹配pattern的行。比如一個

文件file的內容是

wKiom1dyZQWCuYbhAAAU-FFU0VY805.png-wh_50

滿足以1開頭的行並打印:

wKioL1dyZYPCnuUcAAAXnOXpeU0948.png-wh_50

要想只輸出處理結果,應加上-n選項,這種用法相當於grep命令

wKiom1dyZfnRPR0tAAAYzgZbFCU161.png-wh_50


 2> /pattern/d :刪除匹配pattern的行

       刪除file中以6結尾的行

wKiom1dyZtCBMnd4AAAR9AcOl-Q754.png-wh_50

  注意,sed命令不會修改原文件,刪除命令只表示某些行不打印輸出,而不是從原文件中刪去。

  3> /pattern/s/pattern1/pattern2/:查找符合pattern的行,如果不加g的話就

將該行第一個匹配pattern1的字符串替換爲pattern2,如果加g的話就將該行所有pattern1替換爲pattern2.

wKiom1dyaEGTd0lUAAAQI73PZPU815.png-wh_50

wKioL1dyaELQyQTDAAAUabeiPto516.png-wh_50

 4>在替換中&符號和\1 的使用

   &符號相當於要替換的字符串本身,\1和&符合有相同的作用 wKioL1dya3PyBJ9bAAAQtzmOf4k311.png-wh_50

  5> sed -i : 做的操作會修改原文件

wKiom1dybMmzcTfZAAAZQaRPWH8170.png-wh_50

 6>定址

  例如打印file裏的1-2行內容

wKioL1dybUig6aLbAAAOLqSls1U307.png-wh_50

5.模式空間和保持空間

   sed在正常情況下,將處理的行讀入模式空間(pattern space),腳本中

的“sedcommand(sed命令)”就一條接着一條進行處理,直到腳本執行完畢。然後

該行被輸出,模式(pattern space)被清空;接着,在重複執行剛纔的動作,文件

中的新的一行被讀入,直到文件處理完畢。

一般情況下,數據的處理只使用模式空間(pattern space),按照如上的邏輯即

可完成主要任務。但是某些時候,使用通過使用保持空間(hold space),還可以

帶來意想不到的效果。

  模式空間:可以想成工程裏面的流水線,數據之間在它上面進行處理。

  

  保持空間:可以想象成倉庫,我們在進行數據處理的時候,作爲數據的暫存區域。

  正常情況下,如果不顯示使用某些高級命令,保持空間不會使用到!



sed命令:

+ g:[address[,address]]g 將hold space中的內容拷貝到pattern space中,原來                                  pattern space裏的內容清除

+ G:[address[,address]]G 將hold space中的內容追加到pattern space\n後


+ h:[address[,address]]h 將pattern space中的內容拷貝到hold space中,原來                                   的hold space裏的內容被清除

+ H:[address[,address]]H 將pattern space中的內容追加到hold space\n後


+ d:[address[,address]]d 刪除pattern中的所有行,並讀入下一行到pattern中


+ D:[address[,address]]D 刪除multiline pattern中的第一行,不讀入下一行


+ x:交換保持空間和模式空間的內容

+N:表示讀取下一行追加到pattern中

+n:表示讀取下一行到pattern中

命令練習:

 1>給test文件裏的每一行後加一空行

 wKioL1dycf3RsL03AAAMCDmhOww099.png-wh_50wKiom1dycf6Tq958AAAm4riNJ-8899.png-wh_50

 2>用sed模擬出tac的功能(倒序輸出)

 wKiom1dycx6CtOEKAAAdYmSiTiQ182.png-wh_50

  解析逆序的過程:

 wKiom1dyd1uT_tqGAAA6QDgh3Xk562.png-wh_50

 如果是第一行的話,先讀取到pattern space,再將其拷貝到hold space,不是最

後一行的話,刪除pattern space 裏的東西,在進行下次讀取,然後將hold裏的內

容追加到pattern,在將pattern拷貝到hold,重複上述的過程,將將文件的內容逆

序了。

  

 3>追加匹配行到文件結尾

wKiom1dyevPwhaapAAAZwG1_C-A605.png-wh_50

wKioL1dyevTDh2R2AAAWimVAFqE674.png-wh_50

 4>行列轉換

wKioL1dzW8Sx0EEGAAAO-B1yLH8764.png-wh_50

wKiom1dzW8WQU3X6AAAZULy159s106.png-wh_50

wKioL1dzW8XxPnj3AAAPq1JHYQA948.png-wh_50

5>求1~100的求和

wKiom1dzXUbDnfoCAABFqtFqtp0615.png-wh_50

 6>打印奇偶行

wKioL1dzXdzzgTAgAAAZ9qyHQGE218.png-wh_50

7>1-100再求和

wKioL1dzXq3Dd4QvAABEsUSwrzo184.png-wh_50

 :a表示標籤a,ba表示跳轉到a標籤,$表示最後一行,!表示不做後續操作,所

以,$!ba表示最後一行不用跳轉到a標籤,結束此次操作。






 



  




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章