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
- 原因
- 指定的輸入檔案不存在。
- 解法
- 確認檔案路徑是否正確,或改從管線輸入。