[9-15]Sed文本處理——高級用法

本文旨在複習Sed文本處理的保持空間[Hold Space]、高級命令、循環標籤等

知識儲備


  • Sed除了有模式空間外,還有一個保持空間[Hold Space]

  • 模式空間:所有的處理動作、加工都在此處,原材料加工廠,默認動作是打印到終端

  • 保持空間:暫時存放某行內容,存放"行"倉庫,無默認動作,通過命令可實現調度

  • 高級命令:所謂的高級命令通常指模式空間 <---> 保持空間 行的交互,如何交換、覆蓋、追加

  • Sed循環標籤:shell腳本可以用for、while、until循環,而sed是通過調用標籤名來實現循環

  • Sed高級命令工作原理如下圖

wKiom1YDVP2jaFM9AA0CeLMTOCE691.bmp

高級命令


前提說明:無論是模式空間、保持空間,是一個大的容器,是可以容納多行的!!只不過默認情況下我們做的操作都是“覆蓋”行爲的,所以表現爲只有1行,明白了這個概念,再去理解下面的命令。

x交換模式空間與保持空間內容
d刪除當前模式空間內容,並進入下一個循環
D刪除多行模式空間中的首行,並進入下一個循環
n讀取匹配到的下一行至模式空間 [會覆蓋模式空間原有的值]
N讀取匹配到的下一行至模式空間 [追加到原有內容後]
h複製模式空間內容,到保持空間, 覆蓋
H複製模式空間內容,到保持空間, 追加
g複製保持空間內容,到模式空間, 覆蓋
G複製保持空間內容,到模式空間, 追加


下面舉幾個循序漸進的例子:


實驗文本1:

1
2
3
4
5
6
7
8


1 A
2 a
3 B
4 b
5 C
6 c
7 D
8 d

例1:使用sed命令隔行打印輸出偶數行,即第2行、第4行、第6行、第8行等。

實現代碼:

1


sed -n '{n;p}' sed.txt

wKiom1YDbVSyRM6hAATH-BusPp8341.bmp

具體分析:

    1. 加工廠送來一批小鮮肉 1 A, 執行加工操作{n;p},首先做n操作

    2. n操作 --> 由於肉不新鮮丟掉,採購下一批2 a,這裏會把原來加工廠第一批肉丟掉[覆蓋]

    3. p操作 --> 肉質不錯,賣給客戶,即打印輸出到終端上


例2:交換行順序,預期字母出現先小寫再大寫,效果爲首行2 a 下行1 A

實現代碼:

1


 sed -n 'h;n;p;g;p' sed.txt

wKiom1YDcK2Q7hbCAAY5VMhXrK8773.bmp

具體分析:

wKiom1YDdOyD8Lz_AAaptMltz1s931.bmp



實驗文本2:

1
2
3
4
5
6
7
8


lance
@mage.com
yaozong
@mage.com
xiejun
@mage.com
mahuteng
@qq.com

例1:找出那些屬於mage.com的用戶,只顯示用戶名

實現代碼:

1


sed -n -e '/mage/!h' -e '/mage/{x;p}' sed.txt

wKioL1YDh1STNwYOAAQ43MAxdX0763.bmp

具體分析:

wKiom1YDhxzTzmKHAAiz6EtxrwU763.bmp


例2:整理用qq郵箱地址的人,打印出他們的郵箱地址,輸出格式形如[email protected]

實現代碼:

1


 sed -n -e '/qq.com/!h' -e '/qq.com/{H;x;s/\n//p}' sed.txt

具體分析:

wKioL1YDjtjRyMiGAAIxDbj8ELk493.jpg

看到這裏,你可能會對替換命令s/\n//p感到很奇怪,爲何替換\n爲空多行變1行輸出了?

補充說明:模式空間、保持空間中的多行是這樣的

wKioL1YDtUDy6LJOAAj5GFSYLrc169.bmp

循環標籤


編程語言很大的特點是循環語句實現重複執行,sed中沒有for、while、until語句,而是通過定義標籤,調用標籤來實現循環這種功能的。

一般格式爲:

1


sed -n ':標籤名 範圍1 命令1; /模式/b 標籤名' filename

例1:默認s///只能替換每行第一個被匹配的內容,當然如果使用g可以全局替換,這裏我們使用標籤來替換所有的lance爲大寫LANCE

1


lance lance lance lance lance lance lance lance

實現代碼:

1


sed -n ':again s/lance/Lance/;/lance/b again;p' lance.txt

wKiom1YEANiCP7s_AAF6IJy7ffg309.jpg

額外說明:標籤名調用其實不僅可以使用b,準確來說b調用 t調用 T調用

wKioL1YEmS6zfCIxABfUEET9fQA898.bmp

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