grep 工具的功能其实还不够强大,其实说白了,grep实现的只是查找功能,而它却不
能实现把查找的内容替换掉。以前用vim的时候,可以查找也可以替换,但是只局限于在文 本内部来操作,而不能输出到屏幕上。sed工具以及下面要讲的awk工具就能实现把替换的 文本输出到屏幕上的功能了,而且还有其他更丰富的功能。sed和awk都是流式编辑器,是 针对文档的行来操作的。 a.打印某行 sed-n‘n’pfilename 单引号内的n是一个数字,表示第几行b.打印多行打印整个文档用-n‘1,$’p
c. 打印包含某个字符串的行
上面grep中使用的特殊字符,如’^’,‘$’,‘.’,‘*’等同样也能在sed中使用。
d.-e 可以实现多个行为
e.删除某行或者多行
‘d’ 这个字符就是删除的动作了,不仅可以删除指定的单行以及多行,而且还可以删除匹配
某个字符的行,另外还可以删除从某一行一直到文档末行。f. 替换字符或字符串
上例中的’s’就是替换的命令,’g’为本行中全局替换,如果不加’g’,只换该行中出现的第一个。
除了可以使用’/’外,还可以使用其他特殊字符例如’#’或者’@’都没有问题。现在思考一下,如何删除文档中的所有数字或者字母?
有意思吧,[0-9]表示任意的数字。这里你也可以写成[a-zA-Z]甚至[0-9a-zA-Z]
g.调换两个字符串的位置
这个就需要解释一下了,上例中用’()’把所想要替换的字符括起来成为一个整体,因为括号
在sed中属于特殊符号,所以需要在前面加脱意字符’\’,替换时则写成’\1’,‘\2’,‘\3’ 的形式。 除了调换两个字符串的位置外,笔者还常常用到在某一行前或者后增加指定内容。h.直接修改文件的内容
sed-i‘s/:/#/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/login8.删除test.txt中5到10行中所有的数字;
9.删除test.txt 中所有特殊字符(除了数字以及大小写字母); 10.把test.txt中第一个单词和最后一个单词调换位置; 11.把test.txt中出现的第一个数字和最后一个单词替换位置; 12.把test.txt 中第一个数字移动到行末尾; 13.在test.txt 20行到末行最前面加’aaa:’; 现在给出以上练习题的答案,你如果实在想不出如何操作,那你看看答案吧,请尽量多想一 下。 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.txt12. sed's#\([^0-9][^0-9]*\)\([0-9][0-9]*\)\([^0-9].*$\)#\1\3\2#' test.txt
13. sed's/^.*$/&aaa/'test.txt