sed 實用工具按順序逐行將文件讀入到內存中。然後,它執行為該行指定的所有操作,並在完成請求的修改之後將該行放回到內存中,以將其轉儲至終端。完成了這一行上的所有操作之後,它讀取文件的下一行,然後重復該過程直到它完成該文件。sed 默認讀取整個文件並對其中的每一行進行修改,不過可以按需要將操作限制在指定的行上。 有兩點十分重要:源文件(默認地)保持不被修改;輸出可以被重定向到另一文件中,以保存變化。
網上看的使用語法是這樣的:
sed [options] \'{command}\' [filename] [ > output_file]
但我在本地測試的時候,command那塊的 \ 提示報錯,把 \'{command}\' 換成 '{command}' 就沒問題了,所以後面的命令都把 \ 去掉了。
進行簡單修改: ‘s/old value/new value/’
[root@localhost etc]# echo 1 2 3 | sed 's/2/3/'
1 3 3
如果需要對同一行進行多次修改,推薦的方法是:
[root@localhost etc]# echo 1 2 3 4 5 | sed '
> s/2/3/
> s/4/5/
> '
1 3 3 5 5
把命令拆分為多行,每一行以 / 標志結束,最後 ' 閉合所有命令。
進行全局修改:sed在找到一個要修改的項目並作了修改之後繼續處理下一行,而不繼續讀入該行剩余部分。當修改目標是整行時,需要使用全局修改:
[root@localhost etc]# echo 1 2 3 2 4 5 | sed 's/2/3/'
1 3 3 2 4 5
[root@localhost etc]# echo 1 2 3 2 4 5 | sed 's/2/3/g'
1 3 3 3 4 5
有條件地進行修改:
現有如下文件
[root@localhost root]# cat sample
one 1
two 1
three 1
one 1
two 1
two 1
three 1
要將 two 後面的 1 改為 2 ,three 後面的 1 改為 3 :
[root@localhost root]# sed '
> /two/ s/1/2/
> /three/ s/1/3/
> ' sample
one 1
two 2
three 3
one 1
two 2
two 2
three 3
將修改輸出至新的文件保存:
[root@localhost root]# sed '/two/ s/1/2/; /three/ s/1/3/' sample >sample_one
[root@localhost root]# cat sample_one
one 1
two 2
three 3
one 1
two 2
two 2
three 3
使用預編寫的腳本對指定文件進行處理:
[root@localhost root]# cat sedlist
/two/ s/1/2/
/three/ s/1/3/
[root@localhost root]# sed -f sedlist sample
one 1
two 2
three 3
one 1
two 2
two 2
three 3
需要注意的是,無論是sedlist文件還是sed命令中,都不需要帶有''這一對單引號。
對指定行進行處理:
只對5 ,6兩行的1進行替換
[root@localhost root]# sed '5,6 s/1/2/' sample
one 1
two 1
three 1
one 1
two 2
two 2
three 1
sed默認把文件的每一行都打印到屏幕上,而sed -n則覆蓋所有的顯示,不向屏幕輸出。但-n和-p的聯合使用,結果就是只顯示修改過的行:
[root@localhost root]# cat sedlist
/two/ s/1/2/p
/three/ s/1/3/p
[root@localhost root]# sed -n -f sedlist sample
two 2
three 3
two 2
two 2
three 3
從上面可以看到,“one 1”因為沒有修改所以不顯示。
另一種用法是只顯示一定數量的行,如2~6行:
[root@localhost root]# sed -n '2,6p' sample
two 1
three 1
one 1
two 1
two 1
刪除行的語法是 '{條件} d',如果想要刪除某個單詞,可以考慮把它替換為空的做法: 's/cat//'
把文件中帶有 two 的行刪除:
[root@localhost root]# sed '/two/ d' sample
one 1
three 1
one 1
three 1
刪除包含two以外的所有行:
[root@localhost root]# sed '/two/ !d' sample
two 1
two 1
two 1
刪除文件的前三行:
[root@localhost root]# sed '1,3 d' sample
one 1
two 1
two 1
three 1
刪除的部分特殊用法:
刪除以 two 開頭的行:
sed '/^two/ d' sample_one
刪除以 two 結尾的行:
sed '/two$/ d' sample_one
刪除文件中的空行:
sed '/^$/ d' sample
刪除一篇文章中的標題可以采用下面的語法:
sed '1,/^$/ d' filename
添加和插入文本:
結合使用sed和 a,$ 選項在文章末尾添加內容:
[root@localhost root]# sed '$a 123123123123' sample
one 1
two 1
three 1
one 1
two 1
two 1
three 1
123123123123
如果要把內容添加到第三行之後,方法是:
[root@localhost root]# sed '3a cccccccc' sample
one 1
two 1
three 1
cccccccc
one 1
two 1
two 1
three 1
除了添加這個方法外,還有插入(-i)這個選項。比如把內容插入到第三行:
[root@localhost root]# sed '3i cccccccc' sample
one 1
two 1
cccccccc
three 1
one 1
two 1
two 1
three 1
在對文件修改的過程中,還可以同步進行讀寫另外一個文件:
[root@localhost root]# sed '/two/ s/1/2/; /three/ s/1/3/; 1,3 w sample_two' sample
one 1
two 2
three 3
one 1
two 2
two 2
three 3
[root@localhost root]# cat sample_two
one 1
two 2
three 3
上面的命令在替換two和three對應1的同時,把修改後的1~3行輸出到sample_two中。
sed除了替換功能外,還有修改功能(-c)。替換是對於單個項目而言,修改則是對於整行而言。
[root@localhost root]# echo two two | sed '/two/c dddddddd'
dddddddd
[root@localhost root]# echo two two | sed 's/two/dddddddd/'
dddddddd two
[root@localhost root]# echo two two | sed 's/two/dddddddd/g'
dddddddd dddddddd
上面三個命令很好解釋了它們的區別。
提前退出:sed不一定要在掃描所有文件過後才退出,比如只查看前5行:
[root@localhost root]# sed '5q' sample
one 1
two 1
three 1
one 1
two 1
或是滿足一定條件後才退出(匹配到three後退出):
[root@localhost root]# sed '/three/q' sample
one 1
two 1
three 1
還有一些特殊情況,比如將sample文件裡面two替換成three,three替換成four:
[root@localhost root]# sed 's/two/three/; s/three/four/' sample
one 1
four 1
four 1
one 1
four 1
four 1
four 1
如果按照上面命令執行,會發現所有的two和three都變成了four,不符合我們的要求。
[root@localhost root]# sed 's/three/four/; s/two/three/' sample
one 1
three 1
four 1
one 1
three 1
three 1
four 1
但是把兩行處理相反後,則滿足要求了。當執行這種操作時,必須非常用心地注意指定操作的方式,並按某種順序來安排它們,使得操作之間不會互相影響。