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!