sed(Stream Editor)逐行讀取輸入,將當前行載入模式空間處理,執行完所有命令後輸出(除非被刪除),隨後清空模式空間讀入下一行。原檔案不會被修改,除非加 -i 選項。
保持空間是一個輔助緩衝區,初始為空行,用於跨行操作暫存數據。
| 命令 | 作用 |
|---|---|
n | 輸出模式空間,讀入下一行取代當前行,跳至下一條命令 |
N | 讀入下一行追加到模式空間(雙行共存,以 \n 分隔) |
h | 複製模式空間→保持空間(覆蓋) |
H | 追加模式空間→保持空間(換行分隔) |
g | 複製保持空間→模式空間(覆蓋) |
G | 追加保持空間→模式空間(換行分隔) |
x | 交換模式空間與保持空間內容 |
! | 對非匹配行執行後續命令 |
datafile 為例,含 6 行)sed 'G' datafile
原理:每行讀入後執行 G,保持空間初始為空行,追加換行符即產生空行。
sed '/ccc/G' datafile
sed '/ccc/{x;p;x;}' datafile
流程:x 交換→p 列印保持空間(空行)→x 換回→列印原行。
sed '{n;d;}' datafile
n 輸出奇數行並讀入偶數行,d 刪除偶數行不輸出,循環往複。
sed '{n;G;}' datafile
sed '{n;n;G;}' datafile
sed '{n;g;}' datafile
g 用空的保持空間覆蓋模式空間,偶數行變空白。
sed '{N;s/\n/\t/;}' datafile
N 讀入下一行追加,s 將換行符替換為 Tab。
cat -n)sed = datafile | sed '{N;s/\n/\t/;}'
tail -2)sed '{$!N;$!d;}' datafile
倒數第二行前:N 追加下一行,d 刪除模式空間;最後兩行保留輸出。
tac)sed '{1!G;h;$!d;}' datafile
逐行將模式空間存入保持空間(h),非首行先 G 追加保持空間,非尾行 d 抑制輸出,最終保持空間含反序全文,尾行輸出時連帶列印。
| 處理行 | 命令 | 保持空間 | 模式空間 |
|---|---|---|---|
| 第 1 行 | h;d | aaa\n | (刪除,無輸出) |
| 第 2 行 | G;h;d | bbb\naaa\n | (刪除) |
| … | … | 累積反序 | … |
| 最後行 | G;h(無 d) | 完整反序 | 輸出保持空間 |
掌握模式空間與保持空間的交互,是編寫高級 sed 腳本的關鍵。建議結合 sed -n 與 p 命令調試,觀察空間變化,逐步構建複雜邏輯。