在linux的学习和使用中,sed,awk,grep的用法的重要性不言而喻,本文从以下几个方面小结了sed的用法:

1、sed的含义

    sed 是stream editor;就是流编辑器,和我们用到的vi是不同的,vi是全屏编辑器。而且sed是逐行将文件内容取入到内存,进过sed中指定命令进行处理,然后输出到屏幕的。

2、sed的用法及格式

    sed [options] 'StartAdd,EndAddCommand' files,...

[options] 指的是sed的选项。可以省略

StartAdd,EndAdd 指的sed中地址的表示方法

Command指的是sed的处理命令。

files,..可以是多个,是sed的处理对象。即把那个文件放入内存,然后逐行处理的。

3、地址的表示方式

    '1,3p' passwd #表示的含义是,打印passwd文件1到第三行。绝对行数表示法

   

    [root@localhost testdir]# sed -n '1,3p' passwd

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

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

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


    '1,+3p' passwd #表示的含义是:打印第一行及后面的三行的内容。相对行数表示法

    

    [root@localhost testdir]# sed -n '1,+3p' passwd 

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

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

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

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


    '36,$p' passwd #表示打印从38行到最后一行的passwd的内容 $表示最后一行

    [root@localhost testdir]# sed -n '36,$p' passwd 

    user1:x:504:504::/home/user1:/bin/bash

    user2:x:505:505::/home/user2:/bin/bash

    user3:x:506:506::/home/user3:/bin/bash

    

    '/pattern/Command' #表示匹配到patern的行打印,pattern可以是正则表达式

    [root@localhost testdir]# sed -n '/^root/p' passwd

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

    rootbisu:x:500:500:centos_X641:/home/rootbisu:/bin/bash


    '/pattern1/,/pattern2/Command' 用command处理/pattern1/首次匹配到的行,到/pattern2/首次匹配到的行的内容

    

    [root@localhost testdir]# sed -n '/^\<root\>/,/^\<bin\>/p' passwd 

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

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


    sed '3p' passwd # 表示打印passwd的第三行

    [root@localhost testdir]# sed -n '3p' passwd 

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

    

4、sed中命令及参数的用法

    sed既然作为一个流编辑器,那么他的主要命令功能应该体现在编辑上。常见的编辑操作有,打印,删除,替换,添加等操作。

    d:表示删除符合条件的行

    p:表示打印符合条件的行

    a:表示在符合条件的行后,格式:a\string 追加新的内容a是append # a后是什么输出什么。    [root@localhost testdir]# sed  '/^\<root\>/a\appendtest' passwd 

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

    appendtest

    

    i:insert ,表在符合条件的行前,插入新的string.格式i\string    

    [root@localhost testdir]# sed  '/^\<root\>/i\appendtest' passwd 

    appendtest

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

    

    r:read ,rfile表示在符合条件的行的后面将read的file的内容附加

    

    [root@localhost testdir]# sed '/^\<root\>/rgrep.txt' passwd

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

     This is root

    The user is mroot

    rooter is a dog's name.

    Mrooter is not a word 

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

    w:write,wfile表示将符合条件的行写至file中   

    [root@localhost testdir]# sed -n '/^\<root\>/wgrep.txt' passwd

    [root@localhost testdir]# cat grep.txt

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

    s表示查找并替换 # 替换第一次匹配到的项    

    [root@localhost testdir]# sed  's/root/ROOT/' passwd 

    ROOT:x:0:0:root:/root:/bin/bash    

    # 加上参数g表示替换所有匹配到项

    [root@localhost testdir]# sed  's/root/ROOT/g' passwd 

    ROOT:x:0:0:ROOT:/ROOT:/bin/bash

5、常用的参数:

    -n:表示静默模式,只输出处理了的行,其他的不输出

    -i:会将command的结果作用到被处理的文件上      

    -r:表示pattern中可以使用扩展正则表达式  

    -e: 表示可以使用多个命令。sed -e '10,11p' -e '12,13d' 

  

6、sed用法的小结及注意事项

    sed的用法非常关键,需要牢记,sed的用法及格式,地址的表示方法,和常用的命令,以及命令的参数,此处还有需要注意的细节是,可以在sed中使用后项引用。

    有一个文本内容如下:

    he like his like 

    she love her love

    he like his love

    she love his like 

有一个需求,想把like变成liker,想把love变成lover应该怎么处理?这个时候可以使用后项引用了。


    [root@localhost testdir]# sed   's/\(l..e\)/\1r/g' test 

    he liker his liker

    she lover her lover

    he liker his lover 

    she lover her liker 

    [root@localhost testdir]# sed   's/\(l..e\)/\(l,,e\)r/g' test 

    he (l,,e)r his (l,,e)r

    she (l,,e)r her (l,,e)r

    he (l,,e)r his (l,,e)r 

    she (l,,e)r her (l,,e)r 

注意,我们发现,'s/string1/string2/g' 其中string可以是正则表达式,如果是用了-r选项,那么还可以使用扩展正则表达式,但是string2是不能使用正则表达式的。