本文旨在複習Sed文本處理的保持空間[Hold Space]、高級命令、循環標籤等
知識儲備
Sed除了有模式空間外,還有一個保持空間[Hold Space]
模式空間:所有的處理動作、加工都在此處,原材料加工廠,默認動作是打印到終端
保持空間:暫時存放某行內容,存放"行"倉庫,無默認動作,通過命令可實現調度
高級命令:所謂的高級命令通常指模式空間 <---> 保持空間 行的交互,如何交換、覆蓋、追加
Sed循環標籤:shell腳本可以用for、while、until循環,而sed是通過調用標籤名來實現循環
Sed高級命令工作原理如下圖
高級命令
前提說明:無論是模式空間、保持空間,是一個大的容器,是可以容納多行的!!只不過默認情況下我們做的操作都是“覆蓋”行爲的,所以表現爲只有1行,明白了這個概念,再去理解下面的命令。
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郵箱地址的人,打印出他們的郵箱地址,輸出格式形如[email protected]
實現代碼:
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調用