Sed (Stream Editor) 是 Linux 文本處理三劍客之一,以行為單位流式處理,支援正則匹配、地址定位、多命令腳本、保持/模式空間交換,是日志分析、配置文件批量修改、數據清洗的利器。
-n 抑制)。關鍵:默認不修改源文件,輸出至 stdout;使用 -i 就地修改(實為創建臨時文件替換)。
sed [選項] '腳本' 文件...
sed [選項] -f 腳本文件 文件...
sed [選項] -e '腳本1' -e '腳本2' 文件...
| 命令 | 功能 | 示例 |
|---|---|---|
s/模式/替換/標誌 | 替換 | s/old/new/g 全局替換;s#/usr/local#/opt#g 異界符 |
d | 刪除行 | /^#/d 刪除註釋行;1,10d 刪除前 10 行 |
p | 打印行 | -n '/error/p' 僅打印含 error 的行 |
a\文本 | 行後追加 | /^$ /a\NEW_LINE 空行後插入 |
i\文本 | 行前插入 | 1i\# Header 文件首行添加 |
c\文本 | 整行替換 | /TODO/c\DONE 將含 TODO 行替換為 DONE |
y/源/目標/ | 字符轉換 | y/abc/ABC/ 小寫轉大寫 |
q | 退出 | 10q 處理完第 10 行退出 |
w 文件 | 寫入文件 | /error/w errors.txt 錯誤行另存 |
r 文件 | 讀取文件插入 | $r footer.txt 末尾插入 footer |
= | 打印行號 | -n '=/pattern/=p' 打印行號與內容 |
| 地址形式 | 含義 | 示例 |
|---|---|---|
N | 第 N 行 | 5s/foo/bar/ |
$ | 最後一行 | $a\EOF |
/regex/ | 匹配正則的行 | /ERROR/d |
M,N | 第 M 到 N 行 | 10,20s/old/new/g |
/re1/,/re2/ | 從匹配 re1 到匹配 re2 的行範圍 | /START/,/END/p |
N~M | 從第 N 行開始每 M 行 (GNU) | 1~2d 刪除奇數行 |
! | 取反 | /^#/!d 刪除非註釋行 |
# 單行多命令用分號分隔
sed 's/foo/bar/; s/baz/qux/; /^$/d' file
# 多行腳本 (推薦寫入文件,用 -f 調用)
cat > clean.sed <<'EOF'
/^#/d # 刪除註釋
/^$/d # 刪除空行
s/\t/ /g # Tab 轉 4 空格
s/DEBUG/INFO/g # 統一日志級別
/^ERROR/ w errors.txt # 錯誤行導出
EOF
sed -f clean.sed app.log
Sed 擁有模式空間與保持空間,命令 h/H (複製/追加到保持)、g/G (取回/追加到模式)、x (交換)。
# 將每兩行合併為一行 (用換行符分隔)
sed 'N; s/\n/ /' file
# 反轉文件行順序 (tac 效果)
sed '1!G; h; $!d' file
# 在匹配行前後各輸出一行上下文
sed -n '/pattern/{x;p;x;p;x;p}' file
sed -i.bak 's/old/new/g' *.conf # 備份為 .bak 後就地修改
sed -i 's/PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
sed -n 's/^\([0-9.]\+\) .*/\1/p' access.log | sort | uniq -c | sort -nr | head -10
sed -i -e 's/^max_connections.*/max_connections = 1000/' \
-e 's/^buffer_pool_size.*/buffer_pool_size = 4G/' \
/etc/my.cnf
-i:GNU -i 可選備份後綴 -i.bak;BSD 必須提供後綴 -i '' (無備份) 或 -i.bak。-E:GNU/BSD 均支援擴展正則;舊版 BSD 用 -r。N~M 地址:GNU 專有。awk 或 python,Sed 專注行級流式編輯。-i 前必先備份或測試輸出。/ 時改用異界符 s#...#...#、s|...|...|。-n 抑制默認輸出,按需 p 打印。