sed — 串流文字編輯器

對文字串流或檔案執行搜尋取代、刪除、插入等非互動式編輯。

語法

sed [選項] '腳本' [檔案...]

常用選項

選項 說明 範例
-n, --quiet 不自動印出每行(搭配 p 指令使用) sed -n '5p' file
-i[SUFFIX] 直接修改檔案(-i.bak 會先備份) sed -i 's/old/new/' file
-e 腳本 可接多個腳本 sed -e 's/a/b/' -e 's/c/d/' file
-r / -E 使用延伸正規表示式(ERE) sed -E 's/(foo|bar)/baz/'
-f 腳本檔 從檔案讀取 sed 腳本 sed -f script.sed file

使用範例

範例 1:搜尋取代(第一個出現)

將每行第一個出現的 "http" 取代為 "https"(s/樣式/取代/ 格式)。

$ sed 's/http:/https:/' urls.txt
https://example.com
https://another.com
範例 2:搜尋取代(全行所有出現)

加上 g 旗標取代每行中所有符合的字串,而非只取代第一個。

$ sed 's/foo/bar/g' file.txt
範例 3:直接修改檔案(in-place)

使用 -i 直接修改原始檔案。加上 .bak 後綴可先備份原檔。

$ sed -i.bak 's/localhost/production.server/g' config.yml
此操作會建立 config.yml.bak 備份,然後修改原始 config.yml。
範例 4:刪除符合樣式的行

使用 d 指令刪除符合條件的行。這裡刪除所有空行(^$ 匹配空行)。

$ sed '/^$/d' file.txt
範例 5:刪除注釋行

刪除所有以 # 開頭的注釋行,常用於清理設定檔。

$ sed '/^[[:space:]]*#/d' nginx.conf
範例 6:顯示指定行號的行

使用 -n 搭配 p 指令,只輸出第 5 行。

$ sed -n '5p' file.txt
這是第五行的內容
範例 7:顯示行號範圍

顯示第 10 到 20 行的內容,類似 head/tail 的組合。

$ sed -n '10,20p' large-file.txt
(第 10 到 20 行的內容)
範例 8:不區分大小寫取代

使用 I 旗標(GNU sed)進行大小寫不敏感的取代。

$ sed 's/error/WARNING/gI' log.txt
WARNING: connection failed
WARNING: timeout occurred

常見錯誤與排錯

sed: -e expression #1, char 0: no previous regular expression
原因
sed 腳本語法有誤,通常是引號使用不當或腳本格式錯誤。
解法
確認使用單引號包住腳本('s/old/new/'),避免 shell 展開特殊字元。
sed: can't read file: No such file or directory
原因
指定的輸入檔案不存在。
解法
確認檔案路徑是否正確,或改從管線輸入。

延伸閱讀