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

sed(一)单模式空间

时间:2014-07-09 09:03:27      阅读:280      评论:0      收藏:0      [点我收藏+]

标签:原材料

这两天看了下《sed与awk》中的sed部分,感觉很强大,装备库里面又多了件顺手的武器。

sed按照工作场景来分,可以分为单模式空间和多模式空间

单模式空间——一次只处理一行输入

多模式空间——可以处理多行输入

这一篇咱们先总结一下简单的,多模式空间留到下一篇再总结


一.概念

sed是一个非交互式面向字节流的编辑器,输入为文件或stdin,输出为stdout或文件

二.工作原理

举个例子吧。

sed可以比作为一个车间,进入车间的是原材料,出来的成品。 OK,现在对号入座。

  1. 车间的名字叫模式空间

  2. 文件中的每一行内容是一份原材料

  3. 我这个车间产能有限,一次只能生产一件产品,所以一次,只能输入一行

  4. 原材料进入车间之后,在车间中按照一道道的工序去加工,也就是sed的脚本中的一条条指令。

  5. 原材料在被我们的一道工序加工之前,我们的工序首先要检查一下你这个原材料是否合格,这个过程在sed里面叫做模式匹配,匹配的话就执行工序后的动作。不匹配,则跳过该道工序,然后去执行下一道工序。

  6. 所有的工序都完成后,成品离开车间,也就是处理后的行打印输出。

下面,我们将对例子中提到的东西一一做解释。

三.模式空间

所谓模式空间,楼主的理解是:不就是sed干活的地方嘛,从计算机的角度来说就是一块内存了。

这个模式空间有啥特点呢?
特点就是,我这个空间里面,同时只能有一行输入。咱们从计算机的角度来理解下,一行输入怎么加载到模式空间的吧?

我们一个文本文件,呈现给我们的是一行行的内容,而存储的时候,换行符是以"\n"存储的。所以sed加

载文本的时候,遇到"\n"就把"\n"之前的内容,加载到模式空间中,剩下的部分只有等到加载的这一行处理完毕,才会被加载。

OK,知道了怎么加载的了。另外一方面,文本处理也是在这个模式空间里的

楼主画个图,看看差不多就知道了

bubuko.com,布布扣


只有一行输入,有什么好处呢?

好处是,比如说一个10G大小的日志文件,如果用vim这种编辑器的话,可能半天都打不开。

而使用sed就可以快速处理,这是因为sed加载这个10G文件的时候,是一行一行加载的,加载一行内容,使用的内存很小,所以系统负担很小,处理很快。


四.语法结构

sed的两种使用结构

sed [options] script filename

sed -f scriptfile filename

sed脚本较短的时候,直接在命令行用‘‘单引号括起来就OK了。

注意:建议sed脚本用‘‘单引号括起来,这是为了避免shell对特殊字符处理

当sed命令很长的时候,就可以写在文件里面,然后用sed -f 参数读取。

然后说一下,script的结构

  1. script是由一条条指令,组成的。

  2. 指令由模式和过程组成。

  3. 模式是由(/)分割的正则表达式,也可以是行号

  4. 过程是一个或多个被执行的动作

  5. 模式其实就是过程作用的地址

看下面的小例子:

bubuko.com,布布扣

五.寻址

说到寻址,咱们在“语法结构”这一节不是说了吗,sed脚本由一个或多个指令组成,而指令是由模式和过程组成。。。咱们这里说的寻址,就属于这个模式的范畴

OK,那咱们来看看怎么寻址吧?

寻址,其实就是决定一条指令后面的过程,是否执行的模式。 如果你这一行满足我这个地址的要求,那OK,你可以执行我指令后面的过程。 如果不符合,那不好意思了,88。


我们在sed中可以指定0个,1个,或2个地址。而地址,可以为行号,正则表达式,或行寻址符号形式。

注意:正则表达式表示的地址,必须用(/)包起来

  1. 如果没有指定地址,命令默认作用于全部地址

  2. 如果指定一个地址,命令作用于这个地址匹配的任意行

  3. 如果指定了两个地址,则表示这两个地址之间的范围,命令作用于两个地址范围内的任意行

OK,测试了半天,画个图总结一下。

bubuko.com,布布扣

注意,楼主测试了半天,寻址这个东西。发现坑不是一般的多啊。

楼主总结一下大概这么几条吧。当然也可以看楼主画的那张图了,虽然画的丑点,问题基本都说明了。

1.当有两个地址的时候,数字和正则的寻址是有区别的

2.说白了,起始地址,终止地址,数字,正则,排列组合一下,最多四种情况嘛。

3.当数字为起始地址,数字为终止地址,当输入为seq 20| sed ‘‘形式的的时候.

  4,6p这种形式,和咱们猜想的一样,打印4-6行

  4,4p这种形式,打印第4行

  6,4p这种形式,打印第6行

4.当数字为起始地址,正则为终止地址的时候,

  4,/6/p这种形式,打印4-6行

  4,/4/p这种形式,打印第4到20行

  6,/4/p这种形式,打印6到14行

5.当正则为起始地址,正则为终止地址时。

  /4/,/6/p这种形式,打印4-6行和14到16行

  /4/,/4/p这种形式,打印4到14行

  /6/,/4/p这种形式,6到14和16到20行

6.当正则其实地址,数字为终止地址时

  /4/,6p这种形式,打印4到6行,及14行

  /4/,4p这种形式,打印4和14行

  /6/,4p这种形式,打印6和16行


OK,说了这么一大坨子,楼主自己都晕了。一句话概括下吧

当终止地址为数字的时候,咱们要留意一下这个数字是在起始地址前面还是后面的。

这就OK了,其它就和咱们脑子里默认的想法都一个样。



六.命令

sed四部分构成的,sed一个,[option]两个,script三个,filename四个

一,两,四都没啥说的。三,script有两部分,一个是模式,也就是寻址,咱们已经说过,

接下来,咱们说说,3的第二部分过程,也就是一个个的动作命令。

sed的命令,和咱们平时linux里面的命令有点小区别,咱们平时linux的命令,大多都好几个字母的。

sed的命令,全都只用一个字母表示。

《sed与awk》这本书是说sed共有25个命令组成,

基本格式

[address]command         第五节说的,各种地址形式都包括,0个,1个,2个了

[line-address]command    该命令只能作用于单个地址上,不能为地址范围,也就是0个,1个地址

[address]{commadn1;command2;command3}  利用分组,可以在某个地址上,作用多个命令

OK,看看有哪些常用的命令吧

命令
语法
说明
s(替换substitute)
[address]s/pattern/replacement/flags

用replacement替换pattern,flags为标志位

注意:定界符(/)可以为任意非元字符符号,如#,!

注意2:如果address为指定,则替换所有pattern匹配的行

d(删除delete)
[address]d
删除匹配的行,删除后后续命令将不再执行。
a(追加append)
[address]a\text

在匹配行之后,插入text的内容。。书是说a只适用于[line-address]

楼主在Debian7上测了下,[address]也是可以。 估计书太老了吧。后面有好几个命令都是如此

i(插入insert)
[address]i\text
在匹配行之前,插入text内容
c(更改change)
[address]c\text
当为line-address的时候,当前行改为text。当我address的时候,范围内的行,改为一个text,不是一行改为一个text,注意
l(列表list)
[address]l
打印匹配的行,并显示非打印字符。什么叫非打印字符呢?比如说咱们的换行符,制表符等
y(转换)
[address]y/arg1/arg2
在匹配的行内,把arg1的内容转换为arg2的内容。。注意:1.arg1和arg2长度必须相等 2.转换的时候,不是这两个字符串的整体转换。而是对应字符的转换。。。例如arg1为xyz,arg2为abc,那么只要碰到字符x,x就转换为a,只要碰到字符y就转换为字符b
p(打印print)
[address]p
打印匹配的行,注意和l的区别
=(打印行号)
[address]=
打印匹配行的行号,输出的时候,行号是在匹配行的前一行输出的
n(下一步next)
[address]n
输出当前行的内容,并读取匹配行的下一行
r(读取文件read)
[address]r file
将指定的文件file里的内容,读取到匹配行之后
w(写入文件write)
[address]w file
将匹配的行,写入指定的文件file中
q(退出quit)
[line-address]q
读取到匹配的行之后,即退出。退出确实只能,用line-address。其它的命令,楼主测了下都可以用address。。读取到匹配的行即退出,可以提高处理效率




命令,就这些命令了。看看怎么用的吧。

画个图

测试的文本是从书上抄下来的

 HORSEFEATHERS SOFTWARE PRODUCT BULLFTIN

 DESCRIPTION
 + ________

 BigOne Computer offers three software packages from the suite
 of Horsefeathers software products -- Horsefeathers Business
 BASIC, /BASIC Librarian, and LIDO. These software       products can
 fill your requirements for powerful, sophisticated,
 general-purpose business software providing you with a base for
 software custonization. or development.

 Horsefeathers BASIC is -BASCI optimized for use on the BigOne
 machine with UNIX or MS-DOS operating systems. BASIC Librarian
 is a full screen program editor, which also provides the ability

bubuko.com,布布扣

OK,基础部分就到这里了,下一篇总结一下sed多模式空间和流程控制




 

 








本文出自 “西风” 博客,请务必保留此出处http://lixcto.blog.51cto.com/4834175/1436053

sed(一)单模式空间,布布扣,bubuko.com

sed(一)单模式空间

标签:原材料

原文地址:http://lixcto.blog.51cto.com/4834175/1436053

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