除了先前分享過 用 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!