sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

 

常用选项:
        
-n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
        -e∶直接在指令列模式上进行 sed 的动作编辑;
        -f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
        -r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
        -i∶直接修改读取的档案内容,而不是由萤幕输出。
       

常用命令:
        a   ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
        c   ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
        d   ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
         i   ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
         p  ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~
         s  ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!

 

1.以行为单位进行新增/删除:

[root@hpf-linux 222]# nl passwd |sed '1d'  //删除第一行
     2 bin:x:1:1:bin:/bin:/sbin/nologin

     3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@hpf-linux 222]# nl passwd |sed '1,5d' //删除1-5行
     6 sync:x:5:0:sync:/sbin:/bin/sync

     7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
[root@hpf-linux 222]# nl passwd |sed '2,$d' //删除2到最后一行
       
     1 rootmail:x:0:0:root:/root:/bin/bash
[root@hpf-linux 222]# nl passwd |sed '2a linuxer' //在第二行后添加linuxer
      
     1 rootmail:x:0:0:root:/root:/bin/bash

     2 bin:x:1:1:bin:/bin:/sbin/nologin

linuxer

     3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@hpf-linux 222]# nl passwd |sed '2i linuxer' //在第二行前添加linuxer
 
     1 rootmail:x:0:0:root:/root:/bin/bash

linuxer

     2 bin:x:1:1:bin:/bin:/sbin/nologin
[root@hpf-linux 222]# nl passwd |sed '2i linuxer\ndotaer' //在第二行前增加多行用\n换行符

     1 rootmail:x:0:0:root:/root:/bin/bash

linuxer

dotaer

     2 bin:x:1:1:bin:/bin:/sbin/nologin
[root@hpf-linux 222]# nl passwd |sed '1,3i linuxer'//在第一行到第三行前添加linuxer 

linuxer

     1 rootmail:x:0:0:root:/root:/bin/bash

linuxer

     2 bin:x:1:1:bin:/bin:/sbin/nologin

linuxer

     3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@hpf-linux 222]# nl passwd |sed '1c linuxer'//将第一行替代为linuxer 

linuxer

     2 bin:x:1:1:bin:/bin:/sbin/nologin
[root@hpf-linux 222]# nl passwd |sed '1,2c linuxer'//将第一行和第二行替换为linuxer 

linuxer

     3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@hpf-linux 222]# nl passwd |sed '1p' -n //显示第一行需要和-n选项一块使用

     1 rootmail:x:0:0:root:/root:/bin/bash

[root@hpf-linux 222]# nl passwd |sed '$p' -n //显示最后一行

    63 ababababababab

[root@hpf-linux 222]# nl passwd |sed '1,2p' -n //显示1-2行

     1 rootmail:x:0:0:root:/root:/bin/bash

     2 bin:x:1:1:bin:/bin:/sbin/nologin

[root@hpf-linux 222]# nl passwd |sed '4,$p' -n //显示第四行到最后一行

     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
......

 

2.数据的搜寻并显示/删除

[root@hpf-linux 222]# nl passwd |sed '/root/p' -n //显示带有root的行

     1 rootmail:x:0:0:root:/root:/bin/bash

    11 operator:x:11:0:operator:/root:/sbin/nologin
[root@hpf-linux 222]# nl passwd |sed '/root/d'//删除带有root的行  

     2 bin:x:1:1:bin:/bin:/sbin/nologin
   ......
    10 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

    12 games:x:12:100:games:/usr/games:/sbin/nologin

 

 3.数据的搜寻并替换

[root@hpf-linux 222]# nl passwd |sed 's/root/ROOT/g'//后面带g代表全局替换  

     1 ROOTmail:x:0:0:ROOT:/ROOT:/bin/bash

     2 bin:x:1:1:bin:/bin:/sbin/nologin

    ......
    10 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

    11 operator:x:11:0:operator:/ROOT:/sbin/nologin

    12 games:x:12:100:games:/usr/games:/sbin/nologin

[root@hpf-linux 222]# nl passwd |sed  '1,5s/root/ROOT/g'//替换1-5的root替换为ROOT

     1 ROOTmail:x:0:0:ROOT:/ROOT:/bin/bash

     2 bin:x:1:1:bin:/bin:/sbin/nologin

...........
    10 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

    11 operator:x:11:0:operator:/root:/sbin/nologin

    12 games:x:12:100:games:/usr/games:/sbin/nologin
[root@hpf-linux 222]# nl passwd |sed 's/root/ROOT/'//不带g则只会替换每行的第一个  

     1 ROOTmail:x:0:0:root:/root:/bin/bash

     2 bin:x:1:1:bin:/bin:/sbin/nologin

.......
    10 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

    11 operator:x:11:0:operator:/ROOT:/sbin/nologin

    12 games:x:12:100:games:/usr/games:/sbin/nologin
[root@hpf-linux 222]# nl passwd |sed -n 's/root/ROOT/p' //只显示替换后的行  
     
     1 ROOTmail:x:0:0:root:/root:/bin/bash

    11 operator:x:11:0:operator:/ROOT:/sbin/nologin
[root@hpf-linux 222]# sed -n 's/^mysql/mymysql/p' passwd//将以mysql开头的行替换为mymysql  
mymysql:x:503:503::/home/mysql:/sbin/nologin

[root@hpf-linux 222]# sed -n 's/^mysql/&root/p' passwd //&符号表示替换换字符串中被找到的部份, 所有以mysql开头的行都会被替换成它自已加root,变成mysqlroot。 
mysqlroot:x:503:503::/home/mysql:/sbin/nologin

[root@hpf-linux 222]# sed 's/[a-z]/\U&/g' passwd //将小写字母替换成大写字母

ROOTMAIL:X:0:0:ROOT:/ROOT:/BIN/BASH

BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN

DAEMON:X:2:2:DROATAEMON:/SBIN:/SBIN/NOLOGIN

ADM:X:3:4:ADM:/VARRTOOOO/ADM:/SBIN/NOLOGIN

LP:X:4:7:LP:/VAR/SPROOOOTOOL/LPD:/SBIN/NOLOGIN

[root@hpf-linux 222]# sed 's/[A-Z]/\l&/g' passwd //将大写字母替换成小写字母

rootmail:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:droataemon:/sbin:/sbin/nologin

adm:x:3:4:adm:/varrtoooo/adm:/sbin/nologin

lp:x:4:7:lp:/var/sprooootool/lpd:/sbin/nologin
[root@hpf-linux 222]# sed -nr 's/(roo)t/\1T/p' passwd //roo倍标记为1,所有root都会替换为rooT并且打印出来  

rooTmail:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/rooT:/sbin/nologin
 [root@hpf-linux 222]# nl passwd |sed  's/[0-9]//g'//将文本中所有的数字删除

      rootmail:x:::root:/root:/bin/bash

      bin:x:::bin:/bin:/sbin/nologin

      daemon:x:::droataemon:/sbin:/sbin/nologin

      adm:x:::adm:/varrtoooo/adm:/sbin/nologin

      lp:x:::lp:/var/sprooootool/lpd:/sbin/nologin

[root@hpf-linux 222]# nl passwd |sed  's/[^0-9]//g'//将文本中所有的非数字删除

100

211

322

434

547

650

 

4. 正则在sed的应用

[root@hpf-linux 222]# nl passwd |sed -n '/r..t/p'//.. 表示两个任意字符

     1 rootmail:x:0:0:root:/root:/bin/bash

     3 daemon:x:2:2:droataemon:/sbin:/sbin/nologin

     7 shutdown:x:6:0:shutdowr  tn:/sbin:/sbin/shutdown

     8 halt:x:7:0:halt:/sbin:/ro tsbin/halt
[root@hpf-linux 222]# nl passwd |sed -n '/ro*t/p'//*表示零个或者任意个*前面的字符

     1 rootmail:x:0:0:root:/root:/bin/bash

     4 adm:x:3:4:adm:/varrtoooo/adm:/sbin/nologin

     5 lp:x:4:7:lp:/var/sprooootool/lpd:/sbin/nologin

    11 operator:x:11:0:operator:/root:/sbin/nologin
[root@hpf-linux 222]# nl passwd |sed -n '/r.*t/p'//.*贪婪匹配任意个任意字符

     1 rootmail:x:0:0:root:/root:/bin/bash

     3 daemon:x:2:2:droataemon:/sbin:/sbin/nologin

     4 adm:x:3:4:adm:/varrtoooo/adm:/sbin/nologin

     5 lp:x:4:7:lp:/var/sprooootool/lpd:/sbin/nologin

     7 shutdown:x:6:0:shutdowr  tn:/sbin:/sbin/shutdown

     8 halt:x:7:0:halt:/sbin:/ro tsbin/halt
[root@hpf-linux 222]# nl passwd |sed -n '/ro+t/p'//由于+、?、|、()为扩展正则则需要转意或者添加-r选项

[root@hpf-linux 222]#
[root@hpf-linux 222]# nl passwd |sed -nr '/ro+t/p'//+一个或者多个前面的字符

     1 rootmail:x:0:0:root:/root:/bin/bash

     5 lp:x:4:7:lp:/var/sprooootool/lpd:/sbin/nologin

    11 operator:x:11:0:operator:/root:/sbin/nologin
[root@hpf-linux 222]# nl passwd |sed -nr '/ro?t/p'//?零个或者一个前面的字符

     4 adm:x:3:4:adm:/varrtoooo/adm:/sbin/nologin

    17 vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
 [root@hpf-linux 222]# nl passwd |sed -nr '/r[o|a]t/p'//[o|a]表示o、|、a三个任意一个

    11 operator:x:11:0:operator:/root:/sbin/nologin

    20 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

 5.sed 的-e选项的使用

[root@hpf-linux 222]# nl passwd |sed -n -e '/root/p' -e '/mail/p'

     1 rootmail:x:0:0:root:/root:/bin/bash

     1 rootmail:x:0:0:root:/root:/bin/bash

     9 mail:x:8:12:mail:/var/spoolroat/mail:/sbin/nologin

    11 operator:x:11:0:operator:/root:/sbin/nologin

 从上例中可以发现第一行被匹配了两次,我们可以这样理解:当一行与-e '/root/p'匹配时符合要求则打印输出,接着该行行会与 -e '/mail/p' 进行匹配若还符合则仍会输出打印。

[root@hpf-linux 222]# nl passwd |sed -n '/root/p;/mail/p'

     1 rootmail:x:0:0:root:/root:/bin/bash

     1 rootmail:x:0:0:root:/root:/bin/bash

     9 mail:x:8:12:mail:/var/spoolroat/mail:/sbin/nologin

    11 operator:x:11:0:operator:/root:/sbin/nologin

上例的输出与-e的一样,目前对于这样的写法还不是很明白,今后还需阅读相关书籍将该知识点学会.

[root@hpf-linux 222]# nl passwd |egrep -e 'root' -e 'mail' 

     1 rootmail:x:0:0:root:/root:/bin/bash

     9 mail:x:8:12:mail:/var/spoolroat/mail:/sbin/nologin

    11 operator:x:11:0:operator:/root:/sbin/nologin


grep也有-e选项但与sed不同只会打印一边,这些小知识点今后需要注意

 5.sed的顺序调换

[root@hpf-linux 222]# head passwd |sed -r 's/([^:]+)(:.*:)([^:]+$)/\3\2\1/'

/bin/bash:x:0:0:root:/root:rootmail

/sbin/nologin:x:1:1:bin:/bin:bin

/sbin/nologin:x:2:2:droataemon:/sbin:daemon

/sbin/nologin:x:3:4:adm:/varrtoooo/adm:adm

/sbin/nologin:x:4:7:lp:/var/sprooootool/lpd:lp

/bin/sync:x:5:0:sync:/sbin:sync

/sbin/shutdown:x:6:0:shutdowr  tn:/sbin:shutdown

/ro tsbin/halt:x:7:0:halt:/sbin:halt

/sbin/nologin:x:8:12:mail:/var/spoolroat/mail:mail
[root@hpf-linux 222]# head passwd |sed -r 's/([a-z]+)(:.*:)([/a-z]+)/\3\2\1/'

/bin/bash:x:0:0:root:/root:rootmail

/sbin/nologin:x:1:1:bin:/bin:bin

/sbin/nologin:x:2:2:droataemon:/sbin:daemon

/sbin/nologin:x:3:4:adm:/varrtoooo/adm:adm

/sbin/nologin:x:4:7:lp:/var/sprooootool/lpd:lp

/bin/sync:x:5:0:sync:/sbin:sync

/sbin/shutdown:x:6:0:shutdowr  tn:/sbin:shutdown

/ro:x:7:0:halt:/sbin:halt tsbin/halt

/sbin/nologin:x:8:12:mail:/var/spoolroat/mail:mail

/sbin/nologin:x:10:14:uucp:/var/spool/uucp:uucp

 以上两种方法均可,像这样的还有好多全看本人对于正则的理解了!