sed是一个流编辑器,非交互式的编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“缓冲空间”(pattern space) 。接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。
文件内容并没有改变,除非使用重定向存储输出。
sed用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等。
创建测试文件
[root@yfy ~]# cat>person.txt<<EOF > 101,zhangsan,CEO > 102,lisi,CTO > 103,Alex,COO > 104,wangwu,CFO > 105,zhaoliu,CIO > EOF只打印第一行
[root@yfy ~]# sed -n '1p' person.txt 101,zhangsan,CEO查看第3到4行
[root@yfy ~]# sed -n '4,5p' person.txt 104,wangwu,CFO 105,zhaoliu,CIO包含Alex的行
[root@yfy ~]# sed -n '/Alex/p' person.txt 103,Alex,COO最后一行
[root@yfy ~]# sed -n '$p' person.txt 105,zhaoliu,CIO已w开头,u结尾的行
[root@yfy ~]# sed -n '/w.*u/p' person.txt 104,wangwu,CFO从包含101的行到包含104的行
[root@yfy ~]# sed -n '/101/,/104/p' person.txt 101,zhangsan,CEO 102,lisi,CTO 103,Alex,COO 104,wangwu,CFO查询有zhangsan或者lisi的行
如果只用-n是查不出来的,因为默认情况下,sed只支持基本正则表达式。
[root@yfy ~]# sed -rn '/lisi|wangwu/p' person.txt 102,lisi,CTO 104,wangwu,CFO查询指定分行
[root@yfy ~]# sed -n '2p;4p' person.txt 102,lisi,CTO 104,wangwu,CFO将符合制定内容的文本存入另一个文本中
[root@yfy ~]# sed -n '/^104/w hello.txt' person.txt [root@yfy ~]# cat hello.txt 104,wangwu,CFO通过正则取出绝对路径
[root@yfy ~]# echo "/var/log/messages" |sed 's#/.*/##' messagesa ====== append 追加
i ====== insert 插入
在第二行后面加一个新行
[root@yfy ~]# sed '2a hello world' person.txt 101,zhangsan,CEO 102,lisi,CTO hello world 103,Alex,COO 104,wangwu,CFO 105,zhaoliu,CIO在第二行插入一行
[root@yfy ~]# sed '2i hello world' person.txt 101,zhangsan,CEO hello world 102,lisi,CTO 103,Alex,COO 104,wangwu,CFO 105,zhaoliu,CIO删除第一行
[root@yfy ~]# sed '1d' person.txt 102,lisi,CTO 103,Alex,COO 104,wangwu,CFO 105,zhaoliu,CIO显示文件内容但是不包含Alex
方法一:
[root@yfy ~]# grep -v "Alex" person.txt 101,zhangsan,CEO 102,lisi,CTO 104,wangwu,CFO 105,zhaoliu,CIO方法二:
[root@yfy ~]# sed '/Alex/d' person.txt 101,zhangsan,CEO 102,lisi,CTO 104,wangwu,CFO 105,zhaoliu,CIO方法三:
[root@yfy ~]# awk '!/Alex/d' person.txt 101,zhangsan,CEO 102,lisi,CTO 103,Alex,COO 104,wangwu,CFO 105,zhaoliu,CIO方法四:
[root@yfy ~]# sed -n '3!p' person.txt 101,zhangsan,CEO 102,lisi,CTO 104,wangwu,CFO 105,zhaoliu,CIO删除配置文件中#开头的注释行
[root@yfy ~]# sed '/^#/d' my.cnf指定某行进行内容替换
[root@yfy ~]# sed -i '7c SELINUX=Disabled' /etc/selinux/config正则匹配对应内容,然后进行替换
[root@yfy ~]# sed -i '/^SELINUX=/c SELINUX=Disabled' /etc/selinux/config's/old/new/g'
's#old#new#g'
's@old@new@g'
s#old#new#:只会替换每一行的第一个内容
将所有数字替换成*
[root@yfy ~]# sed 's#[0-9]#*#g' person.txt ***,zhangsan,CEO ***,lisi,CTO ***,Alex,COO ***,wangwu,CFO ***,zhaoliu,CIO将每一行的第一个数字替换成*
[root@yfy ~]# sed 's#[0-9]#*#' person.txt *01,zhangsan,CEO *02,lisi,CTO *03,Alex,COO *04,wangwu,CFO *05,zhaoliu,CIO反向引用获取id
[root@yfy ~]# cat >ifconfig.txt<<EOF > lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 > inet 127.0.0.1 netmask 255.0.0.0 > inet6 ::1 prefixlen 128 scopeid 0x10<host> > loop txqueuelen 1000 (Local Loopback) > RX packets 332 bytes 32372 (31.6 KiB) > RX errors 0 dropped 0 overruns 0 frame 0 > TX packets 332 bytes 32372 (31.6 KiB) > TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 > EOF [root@yfy ~]# cat ifconfig.txt |sed -nr 's#.*net (.*) net.*#\1#p' 127.0.0.1