grep 工具的功能其實還不夠強大,其實說白了,grep實現的只是尋找功能,而它卻不
能實現把尋找的內容替換掉。以前用vim的時候,可以尋找也可以替換,但是只局限於在文
本內部來操作,而不能輸出到螢幕上。sed工具以及下面要講的awk工具就能實現把替換的
文本輸出到螢幕上的功能了,而且還有其他更豐富的功能。sed和awk都是流式編輯器,是
針對文檔的行來操作的。 www.2cto.com
a.列印某行 sed-nnpfilename 單引號內的n是一個數字,表示第幾行
b.列印多行列印整個文檔用-n1,p
c. 列印包含某個字串的行
上面grep中使用的特殊字元,如^,,.,*等同樣也能在sed中使用。
d.-e 可以實現多個行為
e.刪除某行或者多行
d 這個字元就是刪除的動作了,不僅可以刪除指定的單行以及多行,而且還可以刪除匹配
某個字元的行,另外還可以刪除從某一行一直到文檔末行。 www.2cto.com
f. 替換字元或字串
上例中的s就是替換的命令,g為本行中全域替換,如果不加g,只換該行中出現的第一個。
除了可以使用/外,還可以使用其他特殊字元例如#或者@都沒有問題。
現在思考一下,如何刪除文檔中的所有數字或者字母?
有意思吧,[0-9]表示任意的數字。這裡你也可以寫成[a-zA-Z]甚至[0-9a-zA-Z]
g.調換兩個字串的位置
這個就需要解釋一下了,上例中用()把所想要替換的字元括起來成為一個整體,因為括弧
在sed中屬於特殊符號,所以需要在前面加脫意字元\,替換時則寫成\1,\2,\3 的形式。
除了調換兩個字串的位置外,筆者還常常用到在某一行前或者後增加指定內容。
h.直接修改檔案的內容
sed-is/:/#/g test.txt ,這樣就可以直接更改test.txt檔案中的內容了。由於這個命令可以
直接把檔案修改,所以在修改前最好先複製一下檔案以免改錯。
sed常用到的也就上面這些了,只要你多加練習就能熟悉它了。為了能讓你更加牢固的
掌握sed的應用,筆者留幾個練習題給你,希望你能認真完成。
1.把/etc/passwd 複製到/root/test.txt,用sed列印所有行;
2.列印test.txt的3到10行;
3.列印test.txt 中包含root的行;
4.刪除test.txt 的15行以及以後所有行;
5.刪除test.txt中包含bash的行;
6.替換test.txt 中root為toor;
7.替換test.txt中/sbin/nologin為/bin/login
8.刪除test.txt中5到10行中所有的數字;
9.刪除test.txt 中所有特殊字元(除了數字以及大小寫字母);
10.把test.txt中第一個單詞和最後一個單詞調換位置;
11.把test.txt中出現的第一個數字和最後一個單詞替換位置;
12.把test.txt 中第一個數字移動到行末尾;
13.在test.txt 20行到末行最前面加aaa:;
現在給出以上練習題的答案,你如果實在想不出如何操作,那你看看答案吧,請盡量多想一
下。 www.2cto.com
1. /bin/cp/etc/passwd /root/test.txt; sed-n'1,$'p test.txt
2. sed-n'3,10'p test.txt
3. sed-n'/root/'p test.txt
4. sed'15,$'d test.txt
5. sed'/bash/'d test.txt
6. sed's/root/toor/g'test.txt
7. sed's#sbin/nologin#bin/login#g' test.txt
8. sed'5,10s/[0-9]//g'test.txt
9. sed's/[^0-9a-zA-Z]//g'test.txt
10. sed's/\(^[a-zA-Z][a-zA-Z]*\)\([^a-zA-Z].*\)\([^a-zA-Z]\)\([a-zA-Z][a-zA-Z]*$\)/\4\2\3\1/'
test.txt
11. sed
's#\([^0-9][^0-9]*\)\([0-9][0-9]*\)\([^0-9].*\)\([^a-zA-Z]\)\([a-zA-Z][a-zA-Z]*$\)#\1\5\3\4\2#'
test.txt
12. sed's#\([^0-9][^0-9]*\)\([0-9][0-9]*\)\([^0-9].*$\)#\1\3\2#' test.txt
13. sed's/^.*$/&aaa/'test.txt