三剑客之sed
sed的执行过程
#条件满足
sed命令先将第一行内容读取到内存中-->判断这一行是否满足条件--->满足-->执行sed中的命令(s,d,i)-->输出到屏幕-->继续读取下一行直到文件最后
#条件不满足
sed命令先将第一行内容读取到内存中-->判断这一行是否满足条件--->不满足-->返回继续读取文件的内容
sed命令的用法
-n:取消默认输出
-r:使sed支持扩展正则(| ())
-i:确认修改
-i.bak:自动备份
sed命令之查询
#查询单行
[root@web02 oldboy]# sed -n '1p' person.txt
101,oldboy,CEO
#查询连续行
[root@web02 oldboy]# sed -n '1,3p' person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
#查询多行
[root@web02 oldboy]# sed -n '2p;5p' person.txt
102,zhangyao,CTO
105,feixue,CIO
#模糊查询
[root@web02 oldboy]# sed -n '/yy/,/^105/p' person.txt
104,yy,CFO
105,feixue,CIO
#过虑多个字符串,使用-r来支持扩展正则
[root@web02 oldboy]# sed -nr '/oldboy|yy/p' person.txt
101,oldboy,CEO
104,yy,CFO
sed命令之增加文件
[root@web02 oldboy]# cat -A person.txt
101,oldboy,CEO$
102,zhangyao,CTO$
103,Alex,COO$
104,yy,CFO$
105,feixue,CIO$
#a在什么之后增加单行
[root@web02 oldboy]# sed '3a oldboy.com' person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
oldboy.com
104,yy,CFO
105,feixue,CIO
#i:在什么之前增加单行
[root@web02 oldboy]# sed '3i oldboy.com' person.txt
101,oldboy,CEO
102,zhangyao,CTO
oldboy.com
103,Alex,COO
104,yy,CFO
105,feixue,CIO
#增加多行
[root@web02 oldboy]# sed '4a odlboy\nhello\aaaa' person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
odlboy
helloaaa
105,feixue,CIO
sed命令之删除
#删除单行
[root@web02 oldboy]# sed '1d' person.txt
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
#删除连续行
[root@web02 oldboy]# sed '1,3d' person.txt
104,yy,CFO
105,feixue,CIO
#删除多行
[root@web02 oldboy]# sed '1d;3d' person.txt
102,zhangyao,CTO
104,yy,CFO
105,feixue,CIO
#使用过滤来删除
[root@web02 oldboy]# sed '/oldboy/d' person.txt
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
#使用正则删除
[root@web02 oldboy]# sed -r '/oldboy|yy/d' person.txt
102,zhangyao,CTO
103,Alex,COO
105,feixue,CIO
#删除最后一行,$表示最后一行
[root@web02 oldboy]# sed '$d' person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
企业案例:不显示文件中的空行
[root@web02 oldboy]# cat -A person.txt
101,oldboy,CEO$
$
102,zhangyao,CTO$
$
103,Alex,COO$
$
104,yy,CFO$
105,feixue,CIO$
#不显示空行,!表示取反
[root@web02 oldboy]# sed -n '/^$/!p' person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
#删除除最后一行以后的内容
[root@web02 oldboy]# sed '$!d' person.txt
105,feixue,CIO
sed命令之替换
#s表示替换,g表示全局替换
[root@web02 oldboy]# sed 's#oldboy#oldgirl#g' person.txt
101,oldgirl,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
#i表示确认修改,i.bak表示自动备份
[root@web02 oldboy]# sed -i.bak 's#oldboy#oldgirl#g' person.txt
[root@web02 oldboy]# ls
person.txt person.txt.bak
sed命令之变量替换
[root@web02 oldboy]# x=oldboy
[root@web02 oldboy]# y=oldgril
#此处无变化是因为单引号与又引号的区别,单引号是所见所得,不会解析当中的特殊符号,双引号和单引号一样,但是会解析当中的特殊符号
[root@web02 oldboy]# sed 's#$x#$y#g' person.txt.bak
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@web02 oldboy]# sed "s#$x#$y#g" person.txt.bak
101,oldgril,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@web02 oldboy]#
sed命令之反向引用
() 扩展正则表达式 在sed中作用,能够记忆它包含的一段正则表达式,并可以通过\1 \2 \3 ... \9 调取出来