sed是一种行编辑器,先将文本一行一行输出到缓冲区,做处理后输出到屏幕上。但是并不会对源码进行操作。
sed "addresscommand" file1....
-n 静默模式,模式空间不显示
-i 直接修改源文件
-e script -e script 多次使用
-f /file 指定一个文件
-r 使用扩展正则
Address :
1.startline,endline
2.使用模式/pattern/
3./pattern1/,/pattern2/ 从/pattern1/开始到pattern2结束的行
4.linuNumber 指定行
$表示最后一行
5.startLine,+N 从指定的行向后n行,一共n+1行
Command :
d 删除符合条件的行,被匹配的不被显示
p 打印符合条件的行
a\string 直接在行的后面进行追加新的行,内容为string
i \string 在指定的行前添加新的内容
r filename 将指定的文件内容添加到指定的行处
w filename 指定范围内的内容存入filename文件中
s/pattern/string/ 查找并替换,默认匹配替换第一个,也可以使用s# # #或s@ @ @
g 全局替换
i 忽略大小写
实例:
1.删除前两行
[root@localhost Test]# sed '1,2d' ~/Test/fstab
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
LABEL=SWAP-sda3 swap swap defaults 0 0
2.打印符合条件的行
[root@localhost Test]# sed '/LABEL/p' ~/Test/fstab
LABEL=/ / ext3 defaults 1 1
LABEL=/ / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
LABEL=/boot /boot ext3 defaults 1 2
tmpfs /dev/shm tmpfs defaults 0 0
这时候被匹配的行会显示两次,所以要使用静默模式
[root@localhost Test]# sed -n '/LABEL/p' ~/Test/fstab
LABEL=/ / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
LABEL=SWAP-sda3 swap swap defaults 0 0
3.在某行之后添加一行
[root@localhost Test]# sed '1a\#hello world' ~/Test/fstab
LABEL=/ / ext3 defaults 1 1
#hello world
LABEL=/boot /boot ext3 defaults 1 2
4.在某行之前添加一行
[root@localhost Test]# sed '1i\#hello world' ~/Test/fstab
#hello world
LABEL=/ / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
5.将其他文件内容插入
[root@localhost Test]# sed '1,2r /etc/issue' ~/Test/fstab
LABEL=/ / ext3 defaults 1 1
Red Hat Enterprise Linux Server release 5.8 (Tikanga)
Kernel \r on an \m
LABEL=/boot /boot ext3 defaults 1 2
Red Hat Enterprise Linux Server release 5.8 (Tikanga)
Kernel \r on an \m
tmpfs /dev/shm tmpfs defaults 0 0
6.将内容写入其他文件
[root@localhost Test]# sed '1,2w /etc/issue' ~/Test/fstab
[root@localhost Test]# cat /etc/issue
LABEL=/ / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
我在做这个的时候,直接把/etc/issue覆盖写了,会导致下次开机提示有问题,幸好我做了备份,复写回去就好。
7.查找并替换
[root@localhost Test]# sed 's/roo/ROO/' ./save
ROOt/12233/dsfs
fdkjvkj/efhudsfhkj/ROOt
ROOt/cjdcjkzdvkj/dsjbj
还要说明的,&作用是引用到整个串
sed 's#l..e#&r#' liv 其实等同于 sed 's#(l..e)#\1r#' liv
[root@localhost Test]# sed -e 's#LABEL#&r#' -e 's/[[:space:]]/---/g' fstab
LABELr=/---------------------------------------------------/---------------------------------------------------------------------ext3------------defaults------------------------1---1
还可以使用脚本
sed -f ./script -e 's/[[:space:]]/---/g' fstab