前段時間在學習shell指令碼,上次有提到sed的模式空間和保持空間概念,但是一直沒有研究好,這兩天研究了一下,所以將它發出來,不是很全面,僅僅供大家參考一下。
保持空間sed在正常情況下,將處理的行讀入模式空間,指令碼中的“sed command(sed命令)”就一條接著一條進行處理,直到指令碼執行完畢。然後該行被輸出,模式被清空;接著,在重複執行剛才的動作,檔案中的新的一行被讀入,直到檔案處理完畢。
模式空間可以比喻為一個生產線,而保持空間則可以被比喻為倉庫,這個比喻希望可以協助大家理解兩者的關係。
sed的指令中用來操作保持空間和模式空間的常見的有一下
為了方便,在下面用P來表示模式空間,M來表示保持空間
h :把模式空間裡的內容複寫到暫存緩衝區(保持空間)
H :把模式空間裡的內容追加到暫存緩衝區(保持空間)
g :把暫存緩衝區裡的內容複寫到模式空間,覆蓋原有的內容
G:把暫存緩衝區的內容追加到模式空間裡,追加在原有內容的後面
d: 刪除pattern中的所有⾏行,並讀入下一新行到P中
D:D 刪除M ,P中的第一行,不讀入下一行
x:交換保持空間和模式空間的內容
下面我就用具體案例來介紹一下用法吧:
1.實現tac功能
其中 1。G 表示第一行不使用G,$!d 表示最後一行不使用d,其執行工程大概是這樣的:
上圖就是資料在兩個空間的轉換過程,不知道大家看懂了沒,其中該行標有d的表示d操作(刪除模式空間的內容),標有G的表示G操作(將內容追加到模式空間,這個操作不會覆蓋原有內容),標有h的表示h操作(將模式空間內容複寫到保持空間,這個會覆蓋原有內容)。最後的結果和我們看到的結果一致。
2.行列轉化
我解釋一下上面的語句吧,H表示吧模式空間的內容追加到保持空間,${...} 表示最後執行,意思是最後才執行{ }裡面的內容,所以最後的時候保持空間裡面的內容和cat的內容一致,x 表示交換保持空間和模式空間的內容,那麼此時模式空間裡的內容就是cat的內容了,此時再使用 "s/p1/p2/g" 替換命令,將分行符號\n,替換成空格,這樣列就變成行了,反之道理一樣。
3.求1~10的和(1~10比較少,觀察起來比較方便,求1~100的和也是很簡單的)
seq的功能是列出1~n的數:
首先: H---追加到保持空間
其次: ${x;s/\n/+/g;s/^+//;p} ---- 最後一行執行(因為${} );交換保持空間和模式空間的內容;將\n替換成+;最後使用bc計算機就可以求出1~10的和了。
以上就是我對保持空間和模式空間的一些理解以及對操作兩個空間的一些指令的使用,可能使用上面的指令可以實現更多的功能,但是我在這裡家就不一一介紹了,這部分確實挺考驗腦力的。大家感興趣的話可以再去多多研究研究,實現更多的功能。