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'