3 個簡單實用的 sed 指令

Posted on  Mar 21, 2021  in  Unix-like 命令列教學  by  Amo Chen  ‐ 2 min read

除了先前分享過 用 sed 指令插入(insert)文字到檔案中的指定行數 之外, sed 指令其實還有很多方便的功能,例如編者最常使用的字串取代、刪除指定行、列印指定行等 3 種,本文將介紹這 3 種 sed 用法。

本文環境

  • Ubuntu

字串取代

sed 可用以取代特定字串,其指令如下:

sed -i 's/a/b/g' filename

上述指令 -i 指的是 edit files in place 直接修改檔案的意思,如果不加上 -i 的話,sed 並不會修改該檔案,而是直接將修改後的結果列印出來。

p.s. 如果是 macOS 內建的 sed 指令,需在 -i 後加上 '' 才能正常執行,這是由於該 sed 指令版本與 Linux 上的版本不同,而 macOS 版本將 -i 改為必須為原檔提供備份檔案的檔名後綴,因此 -i '' 則是不備份的意思,如果用 -i .bak 的話,原本的檔案會被備份到 filename.bak 檔案中

s/a/b/g 其實是字串 a 取代為 b 的意思, a 的部分也接受正規表示式。

例如以下檔案內容,裡面分別是 line 1 到 line 6 :

line 1
line 2
line 3
line 4
line 5
line 6

用以下指令可將檔案中所有的 line 取代成 * 米字號:

$ sed 's/line/*/g' test.txt

其執行結果如下:

* 1
* 2
* 3
* 4
* 5
* 6

如果加上 -i 選項,就會直接修改檔案內容,而非列印結果:

$ sed -i 's/line/*/g' test.txt

刪除指定行

當檔案很大的時候(例如 20G 的檔案),要刪除檔案中的特定行,或指定範圍就相當棘手,如果用文字編輯器開啟檔案,有很高機率會載入失敗,畢竟會受限於記憶體的大小。如果在已經知道行數或範圍的情況下,可以用 sed 進行刪除,其指令如下:

sed -i 'x,yd' filename

上述指令為刪除第 x 行至第 y 行,如果僅需要刪除單行可以使用:

sed -i 'xd' filename

例如以下檔案內容,裡面分別是 line 1 到 line 6 :

line 1
line 2
line 3
line 4
line 5
line 6

使用以下指令刪除第 3 至第 5 行:

$ sed -i '3,5d' test.txt

其執行結果如下:

line 1
line 2
line 6

列印指定行

同樣地,當檔案很大的時候(例如 20G 的檔案),要列印檔案中的特定行,或指定範圍也相當棘手,此時不妨交由 sed 幫忙,列印特定範圍行數的指令如下:

$ sed -n 'x,yp; zq' filename

上述指令代表列印第 x 行到第 y 行,直到第 z 行就提早結束執行,避免 sed 一直讀取到檔案的最後一行。

例如以下檔案內容,裡面分別是 line 1 到 line 6 :

line 1
line 2
line 3
line 4
line 5
line 6

以下指令列印第 3 行到第 5 行,在第 5 行提早結束:

$ sed -n '3,5p;5q' test.txt

其執行結果如下,可以看到只有 3 - 5 行被列印:

line 3
line 4
line 5

如果想列印單行的話,則可以使用以下指令:

sed -n 'xp; xq' filename

例如只列印第 5 行的指令:

$  sed -n '5p;5q' test.txt

以上就是 3 個實用的 sed 用法!

Happy Coding!

對抗久坐職業傷害

研究指出每天增加 2 小時坐著的時間,會增加大腸癌、心臟疾病、肺癌的風險,也造成肩頸、腰背疼痛等常見問題。

然而對抗這些問題,卻只需要工作時定期休息跟伸展身體即可!

你想輕鬆改變現狀嗎?試試看我們的 PomodoRoll 番茄鐘吧! PomodoRoll 番茄鐘會根據你所設定的專注時間,定期建議你 1 項辦公族適用的伸展運動,幫助你打敗久坐所帶來的傷害!

贊助我們的創作

看完這篇文章了嗎? 休息一下,喝杯咖啡吧!

如果你覺得 MyApollo 有讓你獲得實用的資訊,希望能看到更多的技術分享,邀請你贊助我們一杯咖啡,讓我們有更多的動力與精力繼續提供高品質的文章,感謝你的支持!