天天看點

sed ‘N,P,D,lable循環’進階應用綜合執行個體

   有一文本如下:

   我想把文本格式變成姓名加成績格式,圖示如下:

   自己搗鼓好久,用幾條指令實作,具體如下:

   群裡的大神,也寫了條指令,如下:

   相當V5給力的一條sed指令。

   看得雲裡霧裡的。剛好比較有得閑,仔細學習研究了2天時間,終于了解了。特意記錄下了解過程,具體如下:

   指令:sed ':1;N;/\n[A-Za-z]/!s/\n/ /;t1;P;D'

   具體解釋:

   :1到t1,這是一個循環,用到的是 sed t lable,

   N,追加下一行進入比對空間。

   /\n[A-Za-z]/!s/\n/ /,/\n[A-Za-z]/比對任意一個\n(換行符)加英文字母。!不執行,s/\n/ /,删除換行符。這條指令整個的意思是,不比對\n[A-Za-z]的行,删除\n(換行符)。

   P,列印多行比對空間的第一行。

   D,删除多行比對空間的第一行。

   N,P,D結合使用,建立一個輸入輸出循環,維護兩行的比對空間,隻輸出第一行,然後傳回腳本的頂端,将所有指令用于比對空間的第二行。請重點注意這點。NPD三個都寫了就形成個循環,不能單獨分析N或者P或者D。

   具體執行過程:

   1.設立:1 label辨別。

   2.讀入文本第一行 am  

   3.執行N,讀入下一行 99到比對空間 現在比對空間的内容為 am \n 99 

   4.執行比對,不比對,是以删除 \n,比對空間為變為  am 99

   5.設定的結束循環的條件為:/\n[A-Za-z]/,暫時沒有比對到這個條件,執行t1,回到指令頂端1。

   6.讀入下一行,依次執行上面的順序。

   7.從am 到76,全部執行一遍,比對空間的内容為 am 99 100 80 76

   8.讀到yx這行的時候,比對空間内容為 am 99 100 80 76 \n yx,注意:\nyx比對/\n[A-Za-z]/,循環打破,執行P,D。

   9.重點:前面的N必須和P和D一起綜合起來了解。輸出比對空間的第一行:am 99 100 80 76。比對空間的第二行:yx,重新開始順序執行指令。

本文轉自 am2012 51CTO部落格,原文連結:http://blog.51cto.com/goome/1749971