一、sed的优点和缺点:
优点:1.sed是行编辑器,简单方便
2.支持正则表达式
缺点:对列的处理要差一点
二、sed的常用参数:
sed 选项 '动作' file.txt
打印:p
删除:d
替换:s
编辑:i
显示编辑的行:n
追加到行后a\,追加到行前i\,行替换c\
多次命令执行:e
y替换
&用法
三、简单介绍sed的用法:
打印匹配root的行
[root@localhost ~]# sed -n '/root/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
2.删除匹配nologin的行,并打印出来
[root@localhost ~]#sed -n '/nologin/d;p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
news:x:9:13:news:/etc/news:
postgres:x:26:26:PostgreSQL Server:/var/lib/pgsql:/bin/bash
删除2,4行
[root@localhost ~]#sed -n '2,4d' /etc/passwd
删除出现第一次root到第一次出现sync中间的行;正则表达式的/可以换成#或者任意符号
[root@localhost ~]#sed -n '/root/,/sync/d' /etc/passwd
3.把root替换成bob
[root@localhost ~]# sed 's/root/bob/' /etc/passwd
bob:x:0:0:root:/root:/bin/bash
把第2次出现的root替换成bob
[root@localhost ~]# sed 's/root/bob/2' /etc/passwd
root:x:0:0:bob:/root:/bin/bash
把所有的root都替换成bob
[root@localhost ~]# sed 's/root/bob/g' /etc/passwd
bob:x:0:0:bob:/bob:/bin/bash
operator:x:11:0:operator:/bob:/sbin/nologin
把匹配bash的行中root替换成bob
[root@localhost ~]#sed '/bash/s/root/bob/g' /etc/passwd
替换第12行中root为bob
[root@localhost ~]#sed -n '12s/root/bob/p' /etc/passwd
operator:x:11:0:operator:/bob:/sbin/nologin
我平时用的很多的命令,先把文件中匹配#的行号和内容打印出来,然后替换指定行的#为空
[root@localhost ~]# grep -n '#' file.txt
[root@localhost ~]# sed -i '149,213s/#//g' file.txt
匹配video的每一行行首添加"#",注释文本
.*表示任意字符,用&就可以引用s替换命令中正则匹配的所有内容
[root@localhost ~]# sed
-i
'/video/s/.*/#&/'
file
.txt
查找匹配zz开头的行,然后替换
[root@localhost ~]#sed '/^zz/ {s/aaa/bbb/g}' file.txt
把/sbin/nologin替换成/bin/bash,使用单引号也可以
[root@localhost ~]# sed -n s/"\/bin\/bash"/"\/sbin\/nologin"/gp /etc/passwd
root:x:0:0:root:/root:/sbin/nologin
postgres:x:26:26:PostgreSQL Server:/var/lib/pgsql:/sbin/nologin
mysql:x:27:27:MySQL Server:/var/lib/mysql:/sbin/nologin
oracle:x:500:501::/home/oracle:/sbin/nologin
4.i选项会把文件内容更改,重新拷贝一份passwd文件
[root@localhost ~]# sed -i 's/root/bob/g' shell/passwd
bob:x:0:0:bob:/bob:/bin/bash
operator:x:11:0:operator:/bob:/sbin/nologin
5.用grep命令查看,确实被修改了;cat -n shell/passwd 显示所有行和行号
[root@localhost ~]# grep -n 'bob' shell/passwd
1:bob:x:0:0:bob:/bob:/bin/bash
12:operator:x:11:0:operator:/bob:/sbin/nologin
6.在匹配所有bob的下一行写上11111111
[root@localhost ~]# sed -i '/bob/a\11111111' shell/passwd
[root@localhost ~]# more shell/passwd
bob:x:0:0:bob:/bob:/bin/bash
11111111
在匹配所有bob的上一行写上333333
[root@localhost ~]# sed -i '/bob/i\333333' shell/passwd
[root@localhost ~]# more shell/passwd
333333
bob:x:0:0:bob:/bob:/bin/bash
c是替换行的内容,把匹配ONBOOT的这行,替换成ONBOOT=yes
[root@localhost ~]# sed -i '/ONBOOT/c\ONBOOT=yes' /etc/sysconfig/network-scripts/ifcfg-eth0
[root@localhost ~]# grep -n 'ONBOOT' /etc/sysconfig/network-scripts/ifcfg-eth0
5:ONBOOT=yes
7.-e的效果,有两种方式实现
替换第一行的root为bob,替换其它行的root为123
[root@localhost ~]# sed -e '1{s/root/bob/g}' -e '{s/root/123/}' /etc/passwd |cat -n
1 bob:x:0:0:bob:/bob:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 news:x:9:13:news:/etc/news:
11 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
12 operator:x:11:0:operator:/123:/sbin/nologin
替换第一行的root为bob,替换其它行的root为123
[root@localhost ~]# sed -n '{1s/root/bob/g;12s/root/123/;p}' /etc/passwd |cat -n
1 bob:x:0:0:bob:/bob:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 news:x:9:13:news:/etc/news:
11 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
12 operator:x:11:0:operator:/123:/sbin/nologin
查找匹配#的行,并打印行号
[root@localhost objects]# sed -n '/#/{=}' file.txt
45
50
92
93
156
157
8.把a替换成x,b替换成y,c替换成z
[root@localhost ~]#sed '1y/abc/xyz/' file.txt
源文件
[root@localhost ~]#cat file
2015
3015
4015
2 0 1 5分别替换成a b c d
[root@localhost ~]#sed 'y/2015/abcd/' file
abcd
3bcd
4bcd
[root@localhost ~]#sed 's/15/88/g' file
2088
3088
4088
在每一行行首添加注释
[root@localhost ~]#sed 's/^/#/g' file
#2015
#3015
#4015
在每一行行尾添加注释
[root@localhost ~]#sed 's/$/#/g' file
2015#
3015#
4015#