核心特性
- 非互動式:透過指令列或腳本批次處理,適合自動化。
- 行導向:逐行讀入模式空間、處理、輸出,來源檔案預設不修改。
- 強大的正則表達式支援:搜尋、取代、刪除、插入、轉換。
基本語法
sed [選項] '指令' [檔案...]
sed -f 腳本檔 [檔案...]
核心指令集
| 指令 | 功能 | 範例 |
s/舊/新/ | 單行首次取代 | sed 's/tiger/wolf/' |
s/舊/新/g | 全域取代(同行所有) | sed 's/Tuesday/Thursday/g' |
-e 'cmd1' -e 'cmd2' | 多指令執行 | sed -e 's/a/b/' -e 's/c/d/' |
'cmd1; cmd2' | 分號分隔多指令(推薦) | sed 's/a/b/; s/c/d/' |
/pattern/ s/舊/新/ | 條件取代(符合 pattern 行) | sed '/two/ s/1/2/' |
N,M s/舊/新/ | 限定行號範圍 | sed '5,6 s/1/2/' |
-n + p | 僅輸出被修改/符合的行 | sed -n '/two/ s/1/2/p' |
d | 刪除行 | sed '/^$/d' 刪除空行 |
y/來源/目標/ | 字元轉換 | sed 'y/abc/ABC/' |
實戰範例專區
1. 基本取代與全域旗標
echo "The tiger cubs meet Tuesday" | sed 's/tiger/wolf/'
# The wolf cubs meet Tuesday
echo "Tue Tue" | sed 's/Tue/Thu/g'
# Thu Thu
2. 多指令組合
echo "tiger after" | sed 's/tiger/wolf/; s/after/before/'
# wolf before
3. 條件式取代
cat sample_one
one 1
two 1
three 1
sed '/two/ s/1/2/; /three/ s/1/3/' sample_one
# one 1
# two 2
# three 3
4. 腳本檔應用(複雜/重複性工作)
cat > sedlist << 'EOF'
/two/ s/1/2/
/three/ s/1/3/
EOF
sed -f sedlist sample_one
5. 限制行號範圍
sed '5,6 s/1/2/' sample_one # 僅第 5-6 行執行取代
6. 靜默模式配合列印(-n + p)
# 僅顯示被修改的行
sed -n '/two/ s/1/2/p' sample_one
# two 2
# 擷取特定行區間(如第 2-6 行)
sed -n '2,6p' sample_one
7. 就地修改檔案(-i)
sed -i 's/old/new/g' file.txt # 直接修改原檔
sed -i.bak 's/old/new/g' file.txt # 備份原檔為 file.txt.bak
進階技巧
- 分隔字元可自訂:
s|/usr/local|/opt|g 避免斜線衝突。
& 代表被比對的整串:s/root/&_user/ → root_user。
- 搭配正則捕捉群組:
s/\([0-9]*\)\.\([0-9]*\)/\2.\1/ 交換小數點前後。
- 處理不可列印字元請改用
tr。
sed vs awk 選擇指南
- sed:行導向、簡單取代/刪除/擷取、效能極佳。
- awk:欄位導向、複雜邏輯運算、報表產生、程式語言特性強。