sed是Stream EDitor流编辑器的缩写,是GNU的软件项目,项目地址http://www.gnu.org/software/sed/ , 和grep,awk一起为视为linux下文字处理三大神器。


sed的工作原理:简单的讲就是读取一行到内存,处理完再读取下一行,一直到最后一行。

稍微详细一点讲就是读取一行放到模式空间(sed在内存申请的一段内存空间),被模式匹配到则按给定的Action处理,处理完则继续读入下一行,如果没有被模式匹配到则直接继续进入下一步。如果没有给模式则默认是空模式,处理所有的行。


上列子:

  1. sed '/^#/p' /etc/fstab    把/etc/fstab文件中#开头的行打印到屏幕

    1. 选项要放在单引号里,/这里面是模式,支持正则表达式/,p是动作action,表示打印,可以看到这样的话#开头的行会在屏幕上打印两遍,这是因为默认会把模式空间的内容输出到屏幕,可以加-n参数(--quiet | --slient)静默模式,就不会把没被模式匹配到的打印出来了。

  2. sed -n '/^#/!p' /etc/fstab    -n 静默输出,!取反,#开头的行不打印,模式里面不支持取反

  3. sed -n '/bash$/=' /etc/passwd    =也是命令,打印匹配到的行的行号

  4. sed -n '1,3p;8,/^mail/p;/^tcpdump/,/^bob/p' /etc/passwd

sed的地址定界符,打印第1到3行;从第8行开始到第一次匹配到mail开头的行结束;从第一次匹配到tcpdump开头的行开始,到第一次匹配到bob开头的行结束。各个命令段之间用分号分隔。

Tips:如果后面还有tcpdump开头的行则继续往后匹配,直到再次匹配到bob开头的行,如果没有则到最后一行

5. sed '/CentOS/a \sed' /etc/issue 在CentOS后面的一行加上一段文字,i则是在前面一行,c是将匹配到的内容直接替换成反斜杠后面的文字。

6.  which ls | sed '/^alias/d;s/[[:space:]]//g' 获取ls命令的路径,s同vim中的查找替换命令使用方法一样,把空格全部换成什么都没有

7. 

[root@monitersrv ~]# cat << EOF >> lier 
> Whom lione is a lioner.
> Jerry
> Tom
> EOF
[root@monitersrv ~]# sed -n '/\(l..n\).*\1r/p' lier   # 正则表达式
Whom lion is a lionr.
[root@monitersrv ~]# sed -rn '/(l..n).*\1r/p' lier    # -r 使用扩展的正则表达式
Whom lion is a lionr.
[root@monitersrv ~]# sed -i.bak 's/lion/lie/g' lier   # -i | --in-place把模式空间内容写入
# 原文件,i后面可以加上后缀,则会在覆盖原文件前先生成一个以原文件名+后缀为文件名的副本
[root@monitersrv ~]# ls lie*
lier  lier.bak
[root@monitersrv ~]# cat lier.bak 
Whom lion is a lionr.
Jerry
Tom
[root@monitersrv ~]# cat lier
Whom lie is a lier.
Jerry
Tom

8. 

[root@monitersrv ~]# sed '3r /etc/issue' /etc/fstab     # 在第三行后面读取/etc/issue文件

#
# /etc/fstab
CentOS release 6.2 (Final)
Kernel \r on an \m

# Created by anaconda on Fri Dec 21 19:29:44 2012
#
# 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
#
/dev/mapper/VolGroup-lv_root /                       ext4    defaults        1 1
UUID=c35f26c4-3870-4122-b32f-99d177987eae /boot                   ext4    defaults        1 2
/dev/mapper/VolGroup-lv_swap swap                    swap    defaults        0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/sdb1               /bak                    ext4    defaults        1 2 
[root@monitersrv ~]# sed -n '/^\/dev/w /root/fstab' /etc/fstab     # 把模式到的内容写入到/root/fstab文件中
[root@monitersrv ~]# cat fstab
/dev/mapper/VolGroup-lv_root /                       ext4    defaults        1 1
/dev/mapper/VolGroup-lv_swap swap                    swap    defaults        0 0
/dev/sdb1               /bak                    ext4    defaults        1 2 
[root@monitersrv ~]#