一、sed基本简介

    sed是每次读取文件一行内容到一个缓冲区中(模式空间)进行处理,这个处理是指依次调用script中的命令对模式空间中的内容处理。注意是对模式空间的内容进行处理而非原文件,如需对原文件,则需使用选项。

二、用法

sed基本用法及选项:

sed的基本用法:
        sed- stream editor for filtering and transforming text
        sed [OPTION]...{script-only-if-no-other-script} [input-file]...
        sed ‘AddressCommand’ file 
常用选项:
     -i:直接修改原文件
     -r:表示使用扩展正则表达式
     -n∶静默模式,使用安静(silent)模式。在一般sed的用法中,所有来自stdin一般都会输出到屏幕上。
      但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
     -e∶直接在指令列模式上进行 sed 的动作编辑;
     -f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
   
    Address #指定对那些文本进行处理
    1、StartLine,EndLine
    比如1,100 表示从第一行到100行
    $:最后一行 如果是$的话,$与后面的命令应该有一个空格,如果是数字的话则不必
    2、/RegExp/ 还可以使用正则表达式匹配要处理的行
    /^root/
    3、/pattern1/,/pattern2/
    第一次被pattern1匹配到的行开始,至第一次被pattern2匹配到的行结束,这中间的所有行
    4、LineNumber
    比如 sed -n '1p' filename #显示第1行
    5、StartLine, +N
    从startLine开始,向后的N行;

    COMMAND:Command #对上面Address指定的文本行进行相应的处理
           d:删除指定的行
           p:打印
           a \string:在指定的行后面追加新行,内容为string 
           i \string:在指定的行前面添加新的行,内容为string
           r FILE:将指定的文件的内容添加至符合条件的行处
           w FIEL:将地址指定的范围内的行另存之指定的文件中
           s/pattern/string/修饰符:查找并替换
           加修饰符:g:全局替换,i:忽略大小写
           例如 sed 's/hello/hi/gi' 1.txt 表示将1.txt
           中所有的hello或者HELLO或者Hello...统统替换成hello
           s///: s###, s@@@  #注意不一定非得使用/// 也可以使用### @@@ 
           \(\), \1, \2  注意:()一定要进行转义 #可以像正则表达式那样使用反向引用。

上诉实例:

[root@centos7 ~]# cat -n fstab
     1# /etc/fstab
     2# Created by anaconda on Tue Jul 19 14:39:24 2016
     3# Accessible filesystems, by reference, are maintained under '/dev/disk'
     4# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
     5#
     6UUID=f83c52ce-5740-4f02-bb87-6e190360dc30 /                       xfs     defaults        0 0
     7UUID=c98144e4-d1b4-45b1-bb22-3112420ea487 /boot                   xfs     defaults        0 0
     8UUID=dbf5c483-133e-4888-bbb1-a9622d83a930 swap                    swap    defaults        0 0
     9#END
[root@centos7 ~]# sed '1,6d' fstab
UUID=c98144e4-d1b4-45b1-bb22-3112420ea487 /boot                   xfs     defaults  0 0
UUID=dbf5c483-133e-4888-bbb1-a9622d83a930 swap                    swap    defaults  0 0
#END
[root@centos7 ~]# sed -n '1,2p' fstab
# /etc/fstab
# Created by anaconda on Tue Jul 19 14:39:24 2016
[root@centos7 ~]#
[root@centos7 ~]# sed '/^UUID/a \@@@love linux' fstab #a \string 附加内容到匹配的行
# /etc/fstab
# Created by anaconda on Tue Jul 19 14:39:24 2016
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=f83c52ce-5740-4f02-bb87-6e190360dc30 /                       xfs     defaults  0 0
@@@love linux
UUID=c98144e4-d1b4-45b1-bb22-3112420ea487 /boot                   xfs     defaults  0 0
@@@love linux
UUID=dbf5c483-133e-4888-bbb1-a9622d83a930 swap                    swap    defaults  0 0
@@@love linux
#END
[root@centos7 ~]#
[root@centos7 ~]# sed '/^UUID/i \@@@love linux' fstab #指定的行前
# /etc/fstab
# Created by anaconda on Tue Jul 19 14:39:24 2016
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
@@@love linux
UUID=f83c52ce-5740-4f02-bb87-6e190360dc30 /                       xfs     defaults  0 0
@@@love linux
UUID=c98144e4-d1b4-45b1-bb22-3112420ea487 /boot                   xfs     defaults  0 0
@@@love linux
UUID=dbf5c483-133e-4888-bbb1-a9622d83a930 swap                    swap    defaults  0 0
#END
[root@centos7 ~]#
[root@centos7 ~]# sed -n  '/oot/w /tmp/oot.out' fstab
[root@centos7 ~]# cat /tmp/oot.out
UUID=c98144e4-d1b4-45b1-bb22-3112420ea487 /boot                   xfs     defaults  0 0
[root@centos7 ~]# 
[root@centos7 ~]# sed -i 's#boot#Boot#g' fstab
[root@centos7 ~]# grep -i "boot" fstab
UUID=c98144e4-d1b4-45b1-bb22-3112420ea487 /Boot                   xfs     defaults  0 0
[root@centos7 ~]#  
[root@centos7 ~]# cat sed.txt
hello, like
hi,my love
[root@centos7 ~]# sed 's/l..e/&r/g' sed.txt
hello, liker
hi,my lover
[root@centos7 ~]#
[root@centos7 ~]# sed 's/\(l..e\)/\1r/g' sed.txt
hello, liker
hi,my lover
[root@centos7 ~]#

三、练习巩固知识

1、删除/etc/init.d/functions文件中行首的空白符;
[root@centos7 ~]# sed -r 's#^[[:space:]]+##g' /etc/init.d/functions
2、替换/etc/inittab文件中"id:3:initdefault:"一行中的数字为5;
[root@centos6 ~]# sed 's#id:3:initdefault:#id:5:initdefault:#g'  /etc/inittab
3、删除/etc/inittab文件中的空白行;
[root@centos6 ~]# sed -i  '/^$/d' /etc/inittab
4、删除/etc/inittab文件中开头的#号; 
[root@centos6 ~]# sed 's/^#//g' /etc/inittab
5、删除某文件中开头的#号及后面的空白字符,但要求#号后面必须有空白字符;
[root@centos6 ~]# sed -r 's@^#[[:space:]]?@@g' /etc/inittab
6、删除某文件中以空白字符后面跟#类的行中的开头的空白字符及#
[root@centos6 ~]# sed -r 's/^[[:space:]]+#+//g' /etc/inittab

本文转自chengong1013 51CTO博客,原文链接:http://blog.51cto.com/purify/1835389,如需转载请自行联系原作者