码迷,mamicode.com
首页 > 其他好文 > 详细

文本三剑客之一 —— sed

时间:2018-02-03 18:55:58      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:总结   process   att   自己   term   就是   引用   alt   ack   

前言:这一次我们主要来介绍一下文本三剑客之一的sed,并且介绍一下各种用法

一,介绍

    sed (Stream EDitor)

是一种流编辑器,一次处理一行内容,所以我们也称之为行编辑器。

在学习sed之前我们要先了解俩个内容

  • 模式空间

    在用sed对文本进行处理的时候,将正在处理的行储存在一个临时缓冲区中,这个缓冲区我们称为模式空间

  • 保持空间

    对于在模式空间正在处理的行还有其他处理时,暂时储存在另一个临时缓冲区,这个缓冲区称为保持空间

     功能

主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等

二,用法 

sed  选项 '地址定界  编辑命令  编辑内容'

支持正则表达

      常用选项

                               技术分享图片

     地址命令

       技术分享图片

     编辑命令

                             技术分享图片

    查找替换

  s/// (支持使用其他分隔符,例如s@@@)

                             技术分享图片



综合举例详解

进入/app下拷/etc/passwd文件的一半内容,并在其中加几行空行,内容如下

技术分享图片

看例子

技术分享图片

如图所示标记先看第一个示例,sed 一般用单引号,'2p'表示在默认输出的后面输出第二行,文件其他内容都显示出来是因为sed是对行处理,没有要求自然直接输出,而你要输出第二行,所以第二行输出了俩次;想要输出你要输出的那行,那么就用到了 -n ,也就是第二个示例;第三个示例则是打印了模式空间所匹配到的空行的行号,看一下之前文件的内容,是不是结果显示的那几行呢


接下来看一下三个用法相同的选项

技术分享图片

a后面接上文本是在指定行后加文本,2指定地行,所以第二行后面有了root,a后面\这个只是起到分隔作用,可加可不加

技术分享图片

i 是在指定行前面加文本,其他跟a 一样用法

技术分享图片

c 则是替换指定行,所以可以看到原本的第二行没有了,root成为了第二行


看一下匹配字符串的行用这三个命令是应该怎么敲

技术分享图片

匹配字符串的是/pattern/,所以是/root/表示的是可以匹配到root的行,a,i,c,都是一样的


好,看一下其他选项的示例

技术分享图片

首先,模式空间匹配到的是空行,d是删除模式空间匹配的内容,所以最后输出的结果就是没有空行



技术分享图片

这个也是删除,1,10是地址界定匹配第1行到第10行,然后删除


技术分享图片

nl是打印除了空行的行的行号,然后删除第二行到第五行


技术分享图片

这个则是打印非空行的行号之后,在第二行后面增加tea,a 后面的空格则是跟之前提到的\一样 是分隔符


技术分享图片

替换,g是全文替换,前面是被替换的内容,后面是替换的内容,所以是将全文的test换成mytest,至于example,是文件名啊


技术分享图片

这里出现的&,代表的是root,跟后向引用用法相似,但不是后向引用,&代表前面所匹配的字符串



技术分享图片

这个示例讲的则是-e -e ,多项编辑,并且的关系,把文件中的dog换成cat,并且把hi换成lo,没加地址定界和g,就只换每一行第一个匹配到的字符串;加了地址定界就是替换定界的行,加了g就是全文替换


技术分享图片

-i.bak,在修改了文件内容,并且备份到一个以.bak结尾的文件,也就是原来的文件是修改的了,后缀是.bak的则是原文件


三,高级用法

                        技术分享图片

先来看一下模式空间和保持空间的关系

技术分享图片


接下来看一下具体的示例

技术分享图片

分析一下,n是读取匹配到行的下一行覆盖到模式空间,也就是模式空匹配第一行,然后再读取第二行覆盖到模式空间,,所以就只剩第二行了,-n只输出模式空间的内容;以此类推,所以最后就是输出第二行第四行,也就是输出偶数行,选项之间用;间隔,验证一下

技术分享图片

结果确实是输出偶数行,自己敲一下就可以验证,后面的示例就不一一验证了


技术分享图片

!是进行反处理,1!就是不是第一行,G将保持空间的内容追加到模式空间,h将模式空间的内容覆盖到保持空间,$!不是最后一行,删除;整条命令的进行过程就是这样的,读取第一行,是第一行不进行处理,然后模式空间是第一行,覆盖到保持空间,不是最后一行,删除;读取第二行,先将保持空间内容追加到模式空间,保持空间是第一行,所以追加到模式空间的第二行后面,然后模式空间内容覆盖到保持空间,所以现在模式空间和是第二行第一行,然后不是最后一行,所以模式空间的内容删除,一次类推,最后输出的就是倒序内容


技术分享图片

N是读取匹配的行的下一行追加到模式空间,D是删除直到$的内容,一直到最后一行,没有下一行,直接输出,最后输出的结果就是输出最后一行


技术分享图片

这个就是对不是最后一行的内容进行N处理,然后除了最后一行都删除,匹配第一行时,追加第二行到模式空间,然后删除第一行,剩下第二行;再读第二行,模式空间是第二行第三行,删除第一次进行处理留下的第二行,剩下第二行第三行,一次类推结果就是剩下最后两行


技术分享图片

技术分享图片

这俩个放在一起说,g是覆盖,G是追加,从保持空间到模式空间,刚开始的时候没有其他处理保持空间没有内容,所以就是追加或者覆盖空白行,所以最后结果就是G是每一行下面都多了一个空行,g则是都是空行


技术分享图片

之前有过一个例子sed -n 'n;p'是输出偶数行,这次没有-n 'p' ,然后又把模式空间匹配到的偶数行都删除了,所以就剩下奇数行输出了


总结:sed我知道的就这些了,最后再来梳理记忆一下

               技术分享图片


文本三剑客之一 —— sed

标签:总结   process   att   自己   term   就是   引用   alt   ack   

原文地址:http://blog.51cto.com/13572810/2068529

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!