bash编程之sed基础应用

基础定义:

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

bash编程之sed基础应用


对于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


bash编程之sed基础应用

例:如何在/etc/fstab文件中所有以#开头的行后添加两行字符呢,如The comment line和The second line?

1
[root@station94 ~]# sed -e'/^#/a \Thecomment line.\nThe second line.' /etc/fstab


bash编程之sed基础应用

看到了吧,这里在添加的内容中间使用"\n"能够完成换行实现多行同时附加哦!

  • i \text:在符合条件的行前面添加指定内容,在添加的内容中间使用"\n"也能够完成换行来完成多行同时附加。

  例:怎么实现在非#号开头的行前添加两行字符呢??

1
[root@station94 ~]# sed-e'/^#/!i \The frist line.\nThe second line.' /etc/fstab


bash编程之sed基础应用


  • c\text: 将符合条件的行替换为指定的文本;

   例:将/etc/fstab文件中以#开头的部分的行号替换成/etc/fstab


bash编程之sed基础应用


  • 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


bash编程之sed基础应用


  • w /path/to/somefile: 将符合条件的位置保存至指定的文件

   例:将/etc/fstab文件中以#开头的部分保存到hello文件中

1
[root@station94~]# sed -n '/^#/w hello' /etc/fstab


bash编程之sed基础应用


  • =:显示匹配到的行的行号

  例:将/etc/fstab文件中以#开头的部分的行号显示出来


bash编程之sed基础应用


查找替换

sed中的查找替换功能与Vim的查找替换功能相当类似,格式如下:

sed ‘s/要替换的内容/替换为的内容/g’

其中的”/”也可使用其他特殊字符,如@等等;

要替换的内容:可以使用模式;
替换为的内容:不可以使用模式但是可以引用,还可以使用&(被模式匹配到的所有内容);

   例:将which ls命令所的内容中/bin/ls 前的空白字符去掉?


bash编程之sed基础应用

注:例中的g叫做标志位又称修饰符,和Vim的一样,其中g表示全局替换;i表示查找时忽略大小写。


直接修改原文件内容(非常危险)

你以为sed只有这样的能耐吗?你错了,sed甚至可以直接修改原文件的内容,而不必使用管道命令或者重定向,不过,由于这个操作会直接修改原文件,所以你千万不要随便拿系统配置文件来开玩笑啊。

sed的-i选项直接修改原文件;

这个功能在有些时候可以给我们带来很大的帮助,举例说,如果你有一个100万行的文件,你要在第100-1000行加某个字符,此时使用vim可能会疯掉,因为任务庞大,那肿么办?就是用sed。通过查找替换的功能,你甚至不需要使用vim去修改。

总之,这个sed不错,所以要好好学习呦!以上只是基础部分总结,拓展部分还望大家自己搜查学习。




本文转自 z永 51CTO博客,原文链接:http://blog.51cto.com/pangge/1261827


上一篇:C# 网络编程之webBrowser乱码问题及解决知识


下一篇:让机器读懂视频:亿级淘宝视频背后的多模态AI算法揭秘 | 开发者必读(142期)