一、Sed简介
Sed:Stream Editor 流式编辑器 又称行编辑器,每次只编辑一行。Sed工作是在“模式空间”中进行的,并不操作源文件。对源文件无危害。
二、Sed使用格式
Sed命令的常用格式如下:
(1)Sed [options] ‘script’ input_file…
(2)Sed [options] –f script_file input_file…
(3)Sed [options] ‘ADDR1,ADDR2command’ input_file…
例如:#sed ’1,2d’ fstab 就可以将fstab的前两行删除并显示出来,但是它不会改变源文件。
#Sed ‘1,2!d’ fstab 表示删除除第一行和第二行之外的所有行。
(4)Sed [options] ‘/PATTERN/command’ input_file……
&:s/l..e/&er/:表示引用前面匹配到的所有字符。
例如:sed ‘/[[:upper:]]/d’ binary.sh 表示删除所有的大写字母的行。
(5)Sed ‘/PATTERN1/,/PATTERN2/command’ input_file……
说明:这表示从第一次被PATTERN1匹配到的行到第一次被PATTERN2匹配到的中间的所有行执行command命令。
三、Sed的常用选项:
-n:只显示sed匹配到的行。其余行不显示。下文有范例。
-i :可以直接操作原文件。默认情况下sed不会改变原文件,但是-i选项可以修改原文件,此选项应慎用。
-r:可以使用标准正则表达式。默认情况下sed只支持基本正则表达式,但是加上-r选项后则支持扩展正则表达式
-e:多脚本共用。可以同时执行多个命令。例如:
[root@localhost ~]# sed -e 's@\
He love His lover.
She like Her liker.
Dove love Her liker.
也可以这样用,中间用分号隔开:
[root@localhost ~]# sed 's@\
sed的常用命令请看“sed常用命令总结(二)
四、Sed的常用命令
(1)P:模式空间中的文本在处理之前,每一次都会先显示一下;用p命令后再显示一下,即:匹配到的文本显示两次:例如:
[root@localhost ~]# sed '1,2p' fstab
/dev/vol0/root / ext3 defaults 1 1
/dev/vol0/root / ext3 defaults 1 1
/dev/vol0/home /home ext3 defaults 1 2
/dev/vol0/home /home ext3 defaults 1 2
LABEL=/boot /boot ext3 defaults 1 2
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
我们可以看到第1,2行显示了两次。如果你只想显示用sed处理的行,则可在其前加-n选项。例如:sed -n ‘1,2p’ fstab 其显示结果如下:
root@localhost ~]# sed -n '1,2p' fstab
/dev/vol0/root / ext3 defaults 1 1
/dev/vol0/home /home ext3 defaults 1 2
(2)a \:表示在模式匹配到的行后面添加新内容;
i \:表示在模式匹配到的行前面添加新内容;
/n:实现添加多行。如下例所示:
[root@localhost ~]# sed '/#/a \ This is a comment line.\nIt can be ignore.' test.sh
#!/bin/bash
This is a comment line.
It can be ignore.
#
This is a comment line.
It can be ignore.
JUSER() {
if id -u root &> /dev/null;then
echo "Exists"
else
echo "No this user."
fi
}
JUSER &> /dev/null
echo $?
这表示在#行的后面加上两行文字,如果将a换成i则表示在#行的前面添加文字。
注意:sed '/#/!i \ This is a comment line.\nIt can be ignore.' test.sh,如果在i前面加!表示对除了匹配到的行的其他行的前面添加以上两行。这样大家基本明白了a,i命令的使用方法了吧。
(3)r FILE:表示读取某一个文件。例如:
root@localhost ~]# sed '2r c.txt' c.sh #表示在c.sh的第二行添加c.txt的内容。
#!/bin/bash
#
This is my first lesson.
Think you!
line 1
line 2
line 3
[root@localhost ~]# sed '/^#/r c.txt' c.sh #表示在c.sh的#开头的行后面添加c.txt的内容。
#!/bin/bash
This is my first lesson.
Think you!
#
This is my first lesson.
Think you!
line 1
line 2
line 3
(4)w FILE: 可以将模式匹配到的行保存下来。例如:
root@localhost ~]# cat c.sh #显示c.sh中的内容
#!/bin/bash
#
line 1
line 2
line 3
[root@localhost ~]# sed -n '/^#/w cc.sh' c.sh #将c.sh文件中以#开头的行保存在cc.sh中
[root@localhost ~]# cat cc.sh #cc.sh的内容
#!/bin/bash
#