常见用法,增删改查
本文为转载,原文地址张耀的博客
-
增加,插入
i 插入到指定行
a 追加到指定行后
-
单行插入
[root@localhost ~]# cat persion.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@localhost ~]# sed '2i ceshi' persion.txt #插入到第二行
101,oldboy,CEO
ceshi
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@localhost ~]# sed '2a ceshi' persion.txt #追加到第二行之后
101,oldboy,CEO
102,zhangyao,CTO
ceshi
103,Alex,COO
104,yy,CFO
105,feixue,CIO
-
多行插入
[root@localhost ~]# sed '2i ceshi\nceshi2' persion.txt 用\n换行符插入多行
101,oldboy,CEO
ceshi
ceshi2
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@localhost ~]# sed '2a ceshi\nceshi2' persion.txt
101,oldboy,CEO
102,zhangyao,CTO
ceshi
ceshi2
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@localhost ~]# sed '12a Port 52113\nPermitRootLogin no\nPermitEmptyPasswords no\nUseDNS no\nGSSAPIAuthentication no' sshd_config |grep -nvE "^$"
1:# $OpenBSD: sshd_config,v 1.80 2008/07/02 02:24:18 djm Exp $
3:# This is the sshd server system-wide configuration file. See
4:# sshd_config(5) for more information.
6:# This sshd was compiled with PATH=/usr/local/bin:/bin:/usr/bin
8:# The strategy used for options in the default sshd_config shipped with
9:# OpenSSH is to specify options with their default value where
10:# possible, but leave them commented. Uncommented options change a
11:# default value.
13:Port 52113
14:PermitRootLogin no
15:PermitEmptyPasswords no
16:UseDNS no
17:GSSAPIAuthentication no
18:#Port 22 用一条命令添加第13-17行,注意此时没有-i参数,文件是没有修改的
-
指定执行的地址范围
sed软件可以对单行或多行进行处理。如果在sed命令前面不指定地址范围,那么默认会匹配所有行。
用法:n1[,n2]{sed-commands}
地址用逗号分隔的,n1,n2可以用数字、正则表达式、或二者的组合表示。
例子:
10{sed-commands} 对第10行操作
10,20{sed-commands} 对10到20行操作,包括第10,20行
10,+20{sed-commands} 对10到30(10+20)行操作,包括第10,30行
1~2{sed-commands} 对1,3,5,7,……行操作
从第一行开始,等差数列为2的行
10,${sed-commands} 对10到最后一行($代表最后一行)操作,包括第10行
/oldboy/{sed-commands} 对匹配oldboy的行操作
/oldboy/,/Alex/{sed-commands} 对匹配oldboy的行到匹配Alex的行操作
/oldboy/,${sed-commands} 对匹配oldboy的行到最后一行操作
/oldboy/,10{sed-commands} 对匹配oldboy的行到第10行操作,注意:如果前10行没有匹配到oldboy,sed软件会显示10行以后的匹配oldboy的行,如果有。
1,/Alex/{sed-commands} 对第1行到匹配Alex的行操作
/oldboy/,+2{sed-commands} 对匹配oldboy的行到其后的2行,共计3行进行操作
-
删除
d 删除指定行
[root@oldboy ~]# sed 'd' person.txt
[root@oldboy ~]#
[root@oldboy ~]# sed '2d' person.txt
101,oldboy,CEO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@oldboy ~]# sed '2,5d' person.txt
101,oldboy,CEO
[root@oldboy ~]# sed '3,$d' person.txt
101,oldboy,CEO
102,zhangyao,CTO
[root@oldboy ~]# sed '1~2d' person.txt
102,zhangyao,CTO
104,yy,CFO
[root@oldboy ~]# sed '1,+2d' person.txt
104,yy,CFO
105,feixue,CIO
[root@oldboy ~]# sed '/zhangyao/d' person.txt
101,oldboy,CEO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@oldboy ~]# sed '/oldboy/,/Alex/d' person.txt
104,yy,CFO
105,feixue,CIO
[root@oldboy ~]# sed '/oldboy/,3d' person.txt
104,yy,CFO
105,feixue,CIO
-
改
c 用新行取代旧行
[root@oldboy ~]# sed '2c 106,dandan,CSO' person.txt
101,oldboy,CEO
106,dandan,CSO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
s 文本替换 g全局替换
-i 修改文件内容
[root@localhost ~]# sed '2s/10/lumang/g' persion.txt
101,oldboy,CEO
lumang2,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
106
[root@localhost ~]# sed 's/10/lumang/g' persion.txt
lumang1,oldboy,CEO
lumang2,zhangyao,CTO
lumang3,Alex,COO
lumang4,yy,CFO
lumang5,feixue,CIO
lumang6
sed 's/N1/N2/g'
N1,N2均可以使用变量
N1可以使用正则,N2不能用正则
-
分组替换
\( \)
和\1
的使用说明
sed软件的\( \)
的功能可以记住正则表达式的一部分,其中,\1
为第一个记住的模式即第一个小括号中的匹配内容,\2
第二记住的模式,即第二个小括号中的匹配内容,sed最多可以记住9个。
[root@localhost ~]# ifconfig eth0|sed -nr 's/^.*dr:(.*) B.*$/\1/gp'
192.168.111.132
-n 取消默认输出
-r 支持扩展正则,不加-r ,()要转义
's///gp'中的p是打印的意思
-n取消默认输出后,不加p不会输出内容
-
特殊符号
&
代表被替换的内容
[root@localhost ~]# sed 's/oldboy/---&---/g' persion.txt
101,---oldboy---,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
sed重命名文件
[root@localhost logs]# ls
stu_102999_1_finished.jpg stu_102999_3_finished.jpg stu_102999_5_finished.jpg
stu_102999_2_finished.jpg stu_102999_4_finished.jpg
[root@localhost logs]# ls|sed -r 's/(.*)_finished.jpg/mv & \1.jpg/g' |bash
[root@localhost logs]# ls
stu_102999_1.jpg stu_102999_2.jpg stu_102999_3.jpg stu_102999_4.jpg stu_102999_5.jpg
查
p 输出指定内容,但默认会输出2次匹配的结果,因此使用n取消默认输出
[root@localhost ~]# sed '2p' persion.txt
101,oldboy,CEO
102,zhangyao,CTO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
106
输出结果不是想要的第二行,而且第二行重复输出
[root@localhost ~]# sed '2p' persion.txt -n
102,zhangyao,CTO
通常p和-n取消默认输出是一同出现
[root@localhost ~]# sed '2,3p' persion.txt -n
102,zhangyao,CTO
103,Alex,COO
[root@localhost ~]# sed '2,/yy/p' persion.txt -n
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
[root@localhost ~]# sed '/02/,/yy/p' persion.txt -n
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
[root@localhost ~]#