基础定义:
sed:Stream EDitor,行编辑器,也就是说它一次只处理一行内容,但是它可以将文件中的每一行都读取到并且逐行进行处理(不会在原文件上直接改动哟),就是将数据进行替换、删除、新增、选取特定的行等功能哦!我们首先来了解一下sed的用法,再来聊它的用途好了。
sed[options] "script"FILE1 ...
例:只显示/etc/fstab文件中以#开头的行 sed –n “/^#/p” /etc/fstab |
参数选项:
-n:静默模式,即不输出模式空间中的内容,只显示被处理过的 |
-e:指定在一个命令行中使用多个script,格式为-e 'script1' -e 'script2' |
-r:支持使用扩展正则表达式元字符(默认是基础正则表达式) |
-f:/path/to/sed_script:从文件中读取处理脚本,并执行; |
1
2
3
4
5
|
例: [root@station94 ~]# vimsed.script #名称可以随便写 /^#/d #删除以#开头的行 /^proc/r /etc/issue #在以proc开头的行后添加显示issue [root@station94 ~]# sed -fsed.script /etc/fstab |
对于sed而言:主要是由地址定界方式及处理命令组成;而sed地址定界的方式有以下几种:
start_line,end_line:指定行范围;如:1,3 |
start_line,/pattern/: 从当前行到第一次匹配到的行;如:1,/^#/ |
/pattern/:仅显示被模式匹配到的行; |
注:在一个sed语句里面可以写多个编辑命令的,但是要用分号隔开!
1
|
例:sed –n ‘1,3p;6,7p’ /etc/fstab #显示匹配到的1-3和6-7行内容。 |
sed的常用编辑命令:
-
d: 删除
例:删除/etc/fstab中所有以#开头的行和12-15行。
1
|
[root@station94~]# sed -e '12,15d' -e '/^#/d' /etc/fstab
|
-
a \text: 在符合条件的行后面添加指定内容;
例:在/etc/fstab文件中所有以#开头的行后添加The comment line字样
1
|
[root@station94~]# sed -e '/^#/a \ The comment line' /etc/fstab
|
例:如何在/etc/fstab文件中所有以#开头的行后添加两行字符呢,如The comment line和The second line?
1
|
[root@station94 ~]# sed -e '/^#/a \Thecomment line.\nThe second line.' /etc/fstab
|
看到了吧,这里在添加的内容中间使用"\n"能够完成换行实现多行同时附加哦!
-
i \text:在符合条件的行前面添加指定内容,在添加的内容中间使用"\n"也能够完成换行来完成多行同时附加。
例:怎么实现在非#号开头的行前添加两行字符呢??
1
|
[root@station94 ~]# sed-e '/^#/!i \The frist line.\nThe second line.' /etc/fstab
|
-
c\text: 将符合条件的行替换为指定的文本;
例:将/etc/fstab文件中以#开头的部分的行号替换成/etc/fstab
-
r /path/to/somefile: 在符合条件的位置读入指定的文件
例:将根目录下的hello文件内容附加到以UUID开头的行的后面进行显示!
1
2
|
[root@station94~]# sed '/^UUID/r /root/hello' /etc/fstab
[root@station94~]# sed '/^UUID/r hello' /etc/fstab
|
-
w /path/to/somefile: 将符合条件的位置保存至指定的文件
例:将/etc/fstab文件中以#开头的部分保存到hello文件中
1
|
[root@station94~]# sed -n '/^#/w hello' /etc/fstab
|
-
=:显示匹配到的行的行号
例:将/etc/fstab文件中以#开头的部分的行号显示出来
查找替换
sed中的查找替换功能与Vim的查找替换功能相当类似,格式如下:
sed ‘s/要替换的内容/替换为的内容/g’
其中的”/”也可使用其他特殊字符,如@等等; |
要替换的内容:可以使用模式; |
替换为的内容:不可以使用模式但是可以引用,还可以使用&(被模式匹配到的所有内容); |
例:将which ls命令所的内容中/bin/ls 前的空白字符去掉?
注:例中的g叫做标志位又称修饰符,和Vim的一样,其中g表示全局替换;i表示查找时忽略大小写。
直接修改原文件内容(非常危险)
你以为sed只有这样的能耐吗?你错了,sed甚至可以直接修改原文件的内容,而不必使用管道命令或者重定向,不过,由于这个操作会直接修改原文件,所以你千万不要随便拿系统配置文件来开玩笑啊。
sed的-i选项直接修改原文件;
这个功能在有些时候可以给我们带来很大的帮助,举例说,如果你有一个100万行的文件,你要在第100-1000行加某个字符,此时使用vim可能会疯掉,因为任务庞大,那肿么办?就是用sed。通过查找替换的功能,你甚至不需要使用vim去修改。
总之,这个sed不错,所以要好好学习呦!以上只是基础部分总结,拓展部分还望大家自己搜查学习。
本文转自 z永 51CTO博客,原文链接:http://blog.51cto.com/pangge/1261827