有一文本如下:
我想把文本格式變成姓名加成績格式,圖示如下:
自己搗鼓好久,用幾條指令實作,具體如下:
群裡的大神,也寫了條指令,如下:
相當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