一、sed的优点和缺点:

优点:1.sed是行编辑器,简单方便

      2.支持正则表达式

缺点:对列的处理要差一点


二、sed的常用参数:

sed 选项 '动作' file.txt

  1. 打印:p

  2. 删除:d

  3. 替换:s

  4. 编辑:i

  5. 显示编辑的行:n

  6. 追加到行后a\,追加到行前i\,行替换c\

  7. 多次命令执行:e

  8. y替换

  9. &用法


三、简单介绍sed的用法:

  1. 打印匹配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#