Sed

Sed 是 UNIX 中串流編輯器(Stream Editor),可以分析 STDIN(Standard Input)進行取代、刪除、擷取、新增等等動作再使用 STDOUT(Standard Output)輸出。

Notice:GNU 版本的 Sed 與 BSD implementation 的 Sed 會有一些差異,以下例子都是以 GNU/Linux 為測試,部份範例在 BSD 執行可能會無法執行。

常用參數

名稱 功能
-n 沉默模式(Silent)。一般 Sed 的用法中, STDIN 餵進來的資料都會被列在螢幕上,如果加上 -n 參數以後,就只有經過 Sed 處理的那一行才會列出來。
-i 直接修改讀取檔案的內容,而不是用 STDOUT

常用函數

名稱 功能
a 新增:字串會直接新增到目前行數的下一行。
c 取代:字串可以取代 n1, n2 兩個行數之間的資料。
d 刪除
i 插入:字串會直接新增到目前行數的上一行。
p 列印:將某個選擇的資料印出,通常搭配 -n 使用。
s 取代:直接進行取代工作,通常都是搭配正規表示式(Regular Expression)。

常用 Sed Flag

名稱 功能
g Global Replacement ,全範圍取代
i 忽略大小寫
w 寫入檔案

範例資料(Data)

Johnson 100
Johnson 60
Yolanda 80
Shanny 70
Jenny 60

基本用法

# 刪除第 2 行的資料
sed '2d' Data

# 直接修改檔案
sed -i '2d' Data

# 印出第 3 行的資料
sed -n '3p' Data

# 印出第 3 到 5 行的資料
sed -n '3,5p' Data

# 支援 STDIN
cat Data | sed '2d'

# 新增字串在第 2 行之後
cat Data | sed '2a hello world'

# 新增字串在第 2 行之前
cat Data | sed '2i hello world'

# 新增字串在最後一行之後
# $ 代表最後一行
cat Data | sed '$a hello world'

# 將 2~4 行的資料取代
cat Data | sed '2,4c hello world'

# 只取代第 1 個符合的字串
echo 'Kkbox@kkbox.com is Kkbox mail format example' | sed 's/Kkbox/KKBOX/'

# 取代全部符合的字串
echo 'Kkbox@kkbox.com is Kkbox mail format example' | sed 's/Kkbox/KKBOX/g'

# 取代第 3 個符合的字串
echo 'Kkbox@kkbox.com is Kkbox mail format example' | sed 's/box/BOX/3'

# 從第 2 個符合的字串之後才開始取代
echo 'Kkbox@kkbox.com is Kkbox mail format example' | sed 's/box/BOX/2g'

# 忽略大小寫並全部取代
echo 'Kkbox@kkbox.com is Kkbox mail format example' | sed 's/KkBox/KKBOX/ig'

# 取代全部符合的字串,並寫入 mail.list 檔案
echo 'Kkbox@kkbox.com is Kkbox mail format example' | sed 's/Kkbox/KKBOX/gw mail.list'
Categories: Unix