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

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

知識儲備編程


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

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

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

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

  • Sed循環標籤:shell腳本能夠用for、while、until循環,而sed是經過調用標籤名來實現循環
    orm

  • Sed高級命令工做原理以下圖blog

wKiom1YDVP2jaFM9AA0CeLMTOCE691.bmp

高級命令圖片


前提說明:不管是模式空間、保持空間,是一個大的容器,是能夠容納多行的!!只不過默認狀況下咱們作的操做都是「覆蓋」行爲的,因此表現爲只有1行,明白了這個概念,再去理解下面的命令。ci

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郵箱地址的人,打印出他們的郵箱地址,輸出格式形如lance@mage.com

實現代碼:

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

相關文章
相關標籤/搜索