六周第二次课(4月26日)
9.4/9.5 sed
sed -n '/关键字/'p 文件名
支持 . * +(脱义),如果不想脱义的话,可以使用-r选项
其他的也都是可以匹配的,只是稍微麻烦。
如果想用sed打印指定的行
sed -n '2'p passwd
打印第二行
sed -n '2,5'p passwd
打印2-5行
sed -n '2,$'p passwd
打印第二行到最后一行
sed -n '1,$'p passwd
打印全部的行
-e表示可以同时执行多条匹配
sed -e '1'p -e '/root/'p -e '/oo*/'p passwd
相当于把三个条件满足的都打印出来
另外sed也可以大小写全部打印出来,在p前面加上一个I 大写的I
sed -n '/bus/'Ip passwd
sed还有一个作用是显示剩余的行,sed '要删除的行'd filename
sed '1,10'd test,txt
的意思就是打印删除10行后剩余的内容
当然也可以按照关键字所在的行删除显示剩余的。 比如查看非root所在行。可以 sed '/root/'d passwd
sed 有一个真正删除的选项 -i 真的会把内容进行更改
sed -i‘行'd filename
除了按照行号来删以外还可以按照关键字所在的行来删。
sed -i '/zt/'d passwd 是将含有root的那一行删掉
当然sed最重要的功能是查找替换
sed '1,10s/home/lovebay/g' passwd1
1-10行 home换成 lovebay g代表全局
sed替换也支持正则。
sed -r '1,5/lov+/my/g' passwd1 记住要有一个选项 -r
下面这个替换是将第一位和最后以为进行了互换位置
sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/' [^:]非:开头 (.*):一直匹配到最后一个:的位置 最后也是一个非:开头 然后后面跟的是位置
如果有/的时候要脱义 \ 或者有其他的符号作为分割符比如@#
head passwd1 |sed 's/\/bin\/bash/123/g'
head passwd1 |sed '[email protected]\/bin\/[email protected]@g'
如果是想把所有的英文字母删掉
head passwd1 | sed 's/[a-zA-Z]//g' 这个比较好理解
如果想在每一行前面加上aaa如何办?
两个办法,第一个办法是\1这个位置符前面加东西
head passwd1 | sed -r 's/(.*)/aaa:\1/'
或者是用&表示前面括号里的内容
原文地址:http://blog.51cto.com/13691454/2108375