Sed   数据流编辑器

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

常用选项:

-e script 以选项中指定的script来处理输入的文本文件

-f  script 以选项中指定的script文件来处理输入的文本文件

-n 显示scrip处理后的结果

-e 后可跟多个操作

-i 对源文件进行修改操作

常用命令:

a 在匹配到的行后面追加新行

d 删除选择的行

s 替换指定的字符

i 在匹配到的行前面添加新行

r   在匹配到的行后读文件 

p 打印模板块的行

w   匹配到的行写到文件(覆盖)

替换标记:

g 行内全面替换

p 打印行

i 忽略大小写

y 把一个字符翻译成另外的字符

\1 子串匹配标记

& 已匹配字符串标记

实例:

准备测试文件

#!/bin/bash

    echo $1
    shift
    echo $1
    shift
    echo $1

-n选项 和p命令 只打印符合条件的内容
  

     [root@localhost ~]# sed "1,3p" -n shift.test 
            #!/bin/bash

            echo $1

a   在匹配到的行后面追加新行   

 [root@localhost ~]# sed '/^ec/a \hello wolrd ' shift.test 
    #!/bin/bash
    echo $1
    hello wolrd 
    shift
    echo $1
    hello wolrd 
    shift
    echo $1
    hello wolrd 

 

i   在匹配行前面追加新的行

	[root@localhost ~]# sed '/^ec/i \hello wolrd ' shift.test 
	#!/bin/bash
	hello wolrd 
	echo $1
	shift
	hello wolrd 
	echo $1
	shift
	hello wolrd 
	echo $1

在匹配到的行后面追加两行 \n表示换行
    [root@localhost ~]# sed '/^ec/i \hello wolrd\nhello world ' shift.test 

$d  删除文件最后一行

$p   输出最后一行

r   在匹配到的行后读入文件 
 

    [root@localhost ~]# cat test
    haha,nihao
    [root@localhost ~]# sed '/^shift/r ./test' shift.test 
    #!/bin/bash
    echo $1
    shift
    haha,nihao
    echo $1
    shift
    haha,nihao
    echo $1
    shift
    haha,nihao
    echo $1

w   匹配到的行写到文件(覆盖)
 

    [root@localhost ~]# sed '/^shift/w /new' shift.test    
    #!/bin/bash
    echo $1
    shift
    echo $1
    shift
    echo $1
    shift
     echo $1
    [root@localhost ~]# cat /new
    shift
    shift
    shift

s   查找并替换  s/匹配模式/要替换内容/  
  

[root@localhost ~]# sed 's/ec/ce/' shift.test 
    #!/bin/bash
    ceho $1
    shift
    ceho $1
    shift
    ceho $1
    shift
     ceho $1

    [root@localhost ~]# sed '1,3s/ec/ce/' shift.test     指定区间
    [root@localhost ~]# sed '1,3s/ec/ce/g' shift.test    全局
    [root@localhost ~]# sed '1,3s/ec/ce/gi' shift.test   忽略大小写

-f  以选项中指定的script文件来处理输入的文本文件
   

[root@localhost ~]# cat script 
    /^#bind=.*/a \bind=192.168.1.1
    /^#port=.*/a \port=3306
    [root@localhost ~]# sed -f script mysqld 
    [mysqld]
    #bind=0.0.0.0
    bind=192.168.1.1
    #port=3306
    port=3306
    #password=123456


-e 后可跟多个操作
    [root@localhost ~]# sed -e'1,3s/ec/ce/' -e'1,3d' shift.test

例1:①、输出以root开头并且以bash结尾的行

[root@localhost ~]# sed '/^root.*bash$/p' -n /etc/passwd     (指某一行)
    root:x:0:0:root:/root:/bin/bash

②、输出以root开头以bash结尾的行

[root@localhost ~]# sed '/^root/,/bash$/p' -n /etc/passwd     指以root开头,以bash结尾的区间   (指不同行)  
    root:x:0:0:root:/root:/bin/bash            匹配到此行以root开头,则此行不再继续往下匹配以bash结尾这个条件,然后取下一行进模式空间,去匹配是否以bash结尾
    bin:x:1:1:bin:/bin:/sbin/nologin          中间行
    daemon:x:2:2:daemon:/sbin:/sbin/bash       匹配到此行以bash结尾。

例2:\(..\)用于匹配子串,对于匹配到的第一个子串标记为\1,依此类推匹配到的第二个结果就是\2

                                                                                                         先匹配(/总内容/ )  在分组 \(内容\)   从左往右,从外到里
    [root@localhost ~]# sed 's/\(f\)\( l.*e\)/\1x\2y/g' yinyong    首先找到/f l.*e/,然后分组,第一组f  第二组 l.*e  然后替换,第一组后追加x,第二组后追加y
    love
    like
    lhhove
    lovve
    lovee
    flove
    fx livey

例3:grep与sed
    grep -A 2 root /etc/passwd   显示匹配到行和后两行
    sed  '2,+1p' /etc/passwd
    grep -B 2 root /etc/passwd   显示匹配到行和前两行
    sed  '2,-1p' /etc/passwd   不能用,不能查看前一行,因为按行匹配,不回头。