sed(part 1)

来源:互联网 发布:亿次元 淘宝 编辑:程序博客网 时间:2024/05/01 08:13

Stream editor——Sed

since 1998,lasted version 4.2.2


       工作中用的比较多的文档编辑工具,可操作性强,执行速度快,非常适合进行内容庞大的文档操作,用了sed以后就不太想用vi了。由俭入奢易,换句话说,由繁入简易,由易入繁难。


Introduce

  • 流编辑器
     接受标准输入流(stdin),因此可以通过管道接受数据流,而无需将数据事先存入文档或者硬盘上;

  • 轻量级
轻巧
  • 应用范围广
     应用于几乎所有的Unix和Linux;
  • 功能强大
     可以对文档批量进行简单或是复杂的变幻,我们可以玩得很low,也可以玩得比较高级,就是说它的功能也很强大的,初级阶段自己使用的话,参照几个实例应该就差不多了。。。批量体现在可以一次性将命令写入一个脚本,对另外一个脚本下达这个脚本。


Feature
  • 编辑文档

Operating mode
        sed有两个空间,模式空间(pattern space)和保留空间(hold space)。sed是通过匹配用户指定的编辑命令对文档里面的数据基于行执行操作的。但是并不修改原文件里面的数据。先从文档里自上而下each line按行读入(stdin) 至pattern buffer(模式空间,pattern space或许更准确)中,然后与用户输入的命令条件进行匹配,如果符合的话则输出至标准输出stdout,这样按顺序每读入一次就匹配一次,当读取完最后一行,最终将pattern buffer中符合条件的内容输出至标准输出,但是如果命令中没有指定行,那么默认将会应用于所有行。至于保留空间是比较另类的玩法了,平时也用不了那么多,初级篇就不赘述了。





Demo

 eg1:

      sed  -e  'd'  /etc/fstab

    没有输出,-e  是多点编辑,这里可以不要,d是delete之意,前面提到过如果没有指定范围就是应用于所有行,将first_line读入patten buffer,然后执行'd'命令,于是第一行被删掉了,注意:这里的删掉不是删掉源文件里的数据,于是没读一行进来都执行'd'命令,最终pattern buffer的内容就没有了,于是就没有输出了。

   注意:命令使用单引号是个好习惯,这样可以禁用shell的扩展功能。

  eg2:地址定界

sed -e '1d' /etc/fstab    //输出第一行以外的所有行

sed -e '1,3d' /etc/fstab   //输出了1,2,3行以外的所有行

     明白了吧,这里指定了范围,范围的常用表达方式:

      sed  -e   '#,#d'  FILE     //这里#表示数字

      另外:#,+# 则表示相对路径,比如'1,3d'和'1,+2d'是一样的结果

      也可以像seq一样指定步长,sed  -e  '1~2d'  file     则表示输出所有的奇数行。

  eg3更高级灵活的用法,位置界定也可以搭配正则表达式使用,我们先只用正则表达式:

sed  -n  '/^#/p' /etc/fstab        //打印出以#开头的所有行,这里 'p'命令指的是print,但是要搭配-n参数使用,-n指的是静寂模式,表示不输出所有的行,如果没有-n则会输出所有的行


eg4:

sed  '5,/^UUID\*/i  friday' /etc/fstab 

这行略显麻烦,没关系,我们拆解开来看看, '5,/^UUID\*/i  friday' 分为三个部分, 分别是  “5” , “/^UUID\*/ ” , “ i” 。5指的是第5行, “/^UUID\*/ ”指的是所有以UUID开头的行,如果没有\* ,则表示第一个以UUID开头的行,而'i'则是insert,从5到所有以UUID开头的行前面一行插入“friday”,如何,不是那么困难吧,偷笑,关于正则表达式可以试试这个网站 http://regexone.com/

eg5:

sed  '/UUID/a friday' /etc/fstab 

这行的输出效果和i类似,不过是在UUID后面一行加入,'a'是append附加的意思,而这里不用在加\*,想想是为什么,这都是正则表达式的内容了,不用多说,请去看看正则表达式相关的介绍吧。

eg6:

sed  's/UUID/ONLY/' /etc/fstab      

       有没有似曾相识的感觉,没错,和vi里面s///g一样吧,s即start,g即globle全局之意,但是前面已经提到过,没错,如果没有指明后面的范围,那么将会默认匹配从s开始到后面所有的行。这里的s///的斜杠换成:或者是@效果也是一样的,即s:::,s@@@,后面的@是不是有点萌大笑

  eg7:

sed   '/^#/c ball'  /etc/fstab   

        这个'c' 大概是change的意思,指的是替代以#开头的行,注意,不是替代#,还有请记得非数字这种位置界定的选项要用/pattern/斜杠封起来喔。

   eg8比初级难一点的。。。

    我们先编辑一个文档,写入以下内容:

1  2  3  
a  b  c
x  y  z

    然后执行  sed -n  's:. . .:jiu \1+\2 ni*\3:p' sed.sh   输出结果如下:

      哈哈,感受到批量处理的强大功能了吧。这这里\1表示引用左边第一个左括号开始的内容,\2则表示引用第二个左括号开始的内容,没错,这也是正则表达式的内容,如果之前没有没用过的regular express根本不用着急,因为这并不是那么难以接受的语法,网上资源那么多,总有一款适合你。


Usage & Documention

       请自行查看官方文档:

          1.man sed

          2.sed help

         3.info  sed

如果前面三项都不合胃口的话,请google大笑


Author: 网名为什么那么长


0 0
原创粉丝点击