三剑客之sed

三剑客之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 调取出来
posted @ 2019-01-29 22:40  游走在边缘的人  阅读(124)  评论(0编辑  收藏  举报