Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

深入理解 sed 模式空間與保持空間

編輯:Linux 教學

核心概念

sed(Stream Editor)逐行讀取輸入,將當前行載入模式空間處理,執行完所有命令後輸出(除非被刪除),隨後清空模式空間讀入下一行。原檔案不會被修改,除非加 -i 選項。

保持空間是一個輔助緩衝區,初始為空行,用於跨行操作暫存數據。

關鍵命令對照表

命令作用
n輸出模式空間,讀入下一行取代當前行,跳至下一條命令
N讀入下一行追加到模式空間(雙行共存,以 \n 分隔)
h複製模式空間→保持空間(覆蓋)
H追加模式空間→保持空間(換行分隔)
g複製保持空間→模式空間(覆蓋)
G追加保持空間→模式空間(換行分隔)
x交換模式空間與保持空間內容
!對非匹配行執行後續命令

實戰範例(以 datafile 為例,含 6 行)

1. 每行後插入空行

sed 'G' datafile

原理:每行讀入後執行 G,保持空間初始為空行,追加換行符即產生空行。

2. 僅在匹配行後插空行

sed '/ccc/G' datafile

3. 匹配行前插空行

sed '/ccc/{x;p;x;}' datafile

流程:x 交換→p 列印保持空間(空行)→x 換回→列印原行。

4. 刪除偶數行

sed '{n;d;}' datafile

n 輸出奇數行並讀入偶數行,d 刪除偶數行不輸出,循環往複。

5. 偶數行後加空行

sed '{n;G;}' datafile

6. 第 3、6、9… 行後加空行

sed '{n;n;G;}' datafile

7. 將偶數行置空(保留行號)

sed '{n;g;}' datafile

g 用空的保持空間覆蓋模式空間,偶數行變空白。

8. 合併偶數行到上一行(以 Tab 分隔)

sed '{N;s/\n/\t/;}' datafile

N 讀入下一行追加,s 將換行符替換為 Tab。

9. 為檔案加行號(等同 cat -n)

sed = datafile | sed '{N;s/\n/\t/;}'

10. 輸出最後 2 行(等同 tail -2)

sed '{$!N;$!d;}' datafile

倒數第二行前:N 追加下一行,d 刪除模式空間;最後兩行保留輸出。

11. 反序輸出全檔(等同 tac)

sed '{1!G;h;$!d;}' datafile

逐行將模式空間存入保持空間(h),非首行先 G 追加保持空間,非尾行 d 抑制輸出,最終保持空間含反序全文,尾行輸出時連帶列印。

空間變化追蹤表(以反序命令為例)

處理行命令保持空間模式空間
第 1 行h;daaa\n(刪除,無輸出)
第 2 行G;h;dbbb\naaa\n(刪除)
……累積反序…
最後行G;h(無 d)完整反序輸出保持空間

總結

掌握模式空間與保持空間的交互,是編寫高級 sed 腳本的關鍵。建議結合 sed -n 與 p 命令調試,觀察空間變化,逐步構建複雜邏輯。

Copyright © Windows教程網 All Rights Reserved