本文旨在複習Sed文本處理的保持空間[Hold Space]、高級命令、循環標籤等
shell
知識儲備編程
Sed除了有模式空間外,還有一個保持空間[Hold Space]編程語言
模式空間:全部的處理動做、加工都在此處,原材料加工廠,默認動做是打印到終端ide
保持空間:暫時存放某行內容,存放"行"倉庫,無默認動做,經過命令可實現調度spa
高級命令:所謂的高級命令一般指模式空間 <---> 保持空間 行的交互,如何交換、覆蓋、追加3d
Sed循環標籤:shell腳本能夠用for、while、until循環,而sed是經過調用標籤名來實現循環
orm
Sed高級命令工做原理以下圖blog
高級命令圖片
前提說明:不管是模式空間、保持空間,是一個大的容器,是能夠容納多行的!!只不過默認狀況下咱們作的操做都是「覆蓋」行爲的,因此表現爲只有1行,明白了這個概念,再去理解下面的命令。ci
x | 交換模式空間與保持空間內容 |
d | 刪除當前模式空間內容,並進入下一個循環 |
D | 刪除多行模式空間中的首行,並進入下一個循環 |
n | 讀取匹配到的下一行至模式空間 [會覆蓋模式空間原有的值] |
N | 讀取匹配到的下一行至模式空間 [追加到原有內容後] |
h | 複製模式空間內容,到保持空間, 覆蓋 |
H | 複製模式空間內容,到保持空間, 追加 |
g | 複製保持空間內容,到模式空間, 覆蓋 |
G | 複製保持空間內容,到模式空間, 追加 |
下面舉幾個按部就班的例子:
實驗文本1:
1 |
1 A |
例1:使用sed命令隔行打印輸出偶數行,即第2行、第4行、第6行、第8行等。
實現代碼:
1 |
sed -n '{n;p}' sed.txt |
具體分析:
加工廠送來一批小鮮肉 1 A, 執行加工操做{n;p},首先作n操做
n操做 --> 因爲肉不新鮮丟掉,採購下一批2 a,這裏會把原來加工廠第一批肉丟掉[覆蓋]
p操做 --> 肉質不錯,賣給客戶,即打印輸出到終端上
例2:交換行順序,預期字母出現先小寫再大寫,效果爲首行2 a 下行1 A
實現代碼:
1 |
sed -n 'h;n;p;g;p' sed.txt |
具體分析:
實驗文本2:
1 |
lance |
例1:找出那些屬於mage.com的用戶,只顯示用戶名
實現代碼:
1 |
sed -n -e '/mage/!h' -e '/mage/{x;p}' sed.txt |
具體分析:
例2:整理用qq郵箱地址的人,打印出他們的郵箱地址,輸出格式形如lance@mage.com
實現代碼:
1 |
sed -n -e '/qq.com/!h' -e '/qq.com/{H;x;s/\n//p}' sed.txt |
具體分析:
看到這裏,你可能會對替換命令s/\n//p感到很奇怪,爲什麼替換\n爲空多行變1行輸出了?
補充說明:模式空間、保持空間中的多行是這樣的
循環標籤
編程語言很大的特色是循環語句實現重複執行,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 |
額外說明:標籤名調用其實不只可使用b,準確來講有b調用 t調用 T調用