sed 工具的使用

grep 工具的功能其实还不够强大,其实说白了,grep实现的只是查找功能,而它却不能实现把查找的内容替换掉以前用vim的时候,可以查找也可以替换,但是只局限于在文本内部来操作,而不能输出到屏幕上。sed工具以及下面要讲的awk工具就能实现把替换的文本输出到屏幕上的功能了,而且还有其他更丰富的功能。sedawk都是流式编辑器,是针对文档的行来操作的
a. 打印某行 sed -n ‘n’p filename 单引号内的n是一个数字,表示第几行



b. 打印多行
打印整个文档用 -n ‘1,$’p



c. 打印包含某个字符串的行



上面grep中使用的特殊字符,如’^’, ‘$’, ‘.’, ‘*’等同样也能在sed中使用




d. -e 可以实现多个行为



e. 删除某行或者多行



‘d’ 这个字符就是删除的动作了,不仅可以删除指定的单行以及多行,而且还可以删除匹配某个字符的行,另外还可以删除从某一行一直到文档末行



f. 替换字符或字符串



上例中的’s’就是替换的命令,’g’为本行中全局替换,如果不加’g’,只换该行中出现的第一个
除了可以使用’/’外,还可以使用其他特殊字符例如’#’或者[email=’@’]’@’[/email]都没有问题



现在思考一下,如何删除文档中的所有数字或者字母?



有意思吧,[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.txt310行;
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.txt510行中所有的数字;
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.txt
12. sed 's#\([^0-9][^0-9]*\)\([0-9][0-9]*\)\([^0-9].*$\)#\1\3\2#' test.txt
13. sed '20,$s/^.*$/aaa:&/' test.txt

添加新评论 »