这两天看了下《sed与awk》中的sed部分,感觉很强大,装备库里面又多了件顺手的武器。
sed按照工作场景来分,可以分为单模式空间和多模式空间
单模式空间——一次只处理一行输入
多模式空间——可以处理多行输入
这一篇咱们先总结一下简单的,多模式空间留到下一篇再总结
一.概念
sed是一个非交互式面向字节流的编辑器,输入为文件或stdin,输出为stdout或文件
二.工作原理
举个例子吧。
sed可以比作为一个车间,进入车间的是原材料,出来的成品。 OK,现在对号入座。
- 车间的名字叫模式空间
- 文件中的每一行内容是一份原材料
- 我这个车间产能有限,一次只能生产一件产品,所以一次,只能输入一行
- 原材料进入车间之后,在车间中按照一道道的工序去加工,也就是sed的脚本中的一条条指令。
- 原材料在被我们的一道工序加工之前,我们的工序首先要检查一下你这个原材料是否合格,这个过程在sed里面叫做模式匹配,匹配的话就执行工序后的动作。不匹配,则跳过该道工序,然后去执行下一道工序。
- 所有的工序都完成后,成品离开车间,也就是处理后的行打印输出。
下面,我们将对例子中提到的东西一一做解释。
三.模式空间
所谓模式空间,楼主的理解是:不就是sed干活的地方嘛,从计算机的角度来说就是一块内存了。
这个模式空间有啥特点呢?
特点就是,我这个空间里面,同时只能有一行输入。咱们从计算机的角度来理解下,一行输入怎么加载到模式空间的吧?
我们一个文本文件,呈现给我们的是一行行的内容,而存储的时候,换行符是以"\n"存储的。所以sed加
载文本的时候,遇到"\n"就把"\n"之前的内容,加载到模式空间中,剩下的部分只有等到加载的这一行处理完毕,才会被加载。
OK,知道了怎么加载的了。另外一方面,文本处理也是在这个模式空间里的
楼主画个图,看看差不多就知道了
只有一行输入,有什么好处呢?
好处是,比如说一个10G大小的日志文件,如果用vim这种编辑器的话,可能半天都打不开。
而使用sed就可以快速处理,这是因为sed加载这个10G文件的时候,是一行一行加载的,加载一行内容,使用的内存很小,所以系统负担很小,处理很快。
四.语法结构
sed的两种使用结构
sed [options] script filename
sed -f scriptfile filename
sed脚本较短的时候,直接在命令行用‘‘单引号括起来就OK了。
注意:建议sed脚本用‘‘单引号括起来,这是为了避免shell对特殊字符处理
当sed命令很长的时候,就可以写在文件里面,然后用sed -f 参数读取。
然后说一下,script的结构
- script是由一条条指令,组成的。
- 指令由模式和过程组成。
- 模式是由(/)分割的正则表达式,也可以是行号
- 过程是一个或多个被执行的动作
- 模式其实就是过程作用的地址
看下面的小例子:
五.寻址
说到寻址,咱们在“语法结构”这一节不是说了吗,sed脚本由一个或多个指令组成,而指令是由模式和过程组成。。。咱们这里说的寻址,就属于这个模式的范畴
OK,那咱们来看看怎么寻址吧?
寻址,其实就是决定一条指令后面的过程,是否执行的模式。 如果你这一行满足我这个地址的要求,那OK,你可以执行我指令后面的过程。 如果不符合,那不好意思了,88。
我们在sed中可以指定0个,1个,或2个地址。而地址,可以为行号,正则表达式,或行寻址符号形式。
注意:正则表达式表示的地址,必须用(/)包起来
- 如果没有指定地址,命令默认作用于全部地址
- 如果指定一个地址,命令作用于这个地址匹配的任意行
- 如果指定了两个地址,则表示这两个地址之间的范围,命令作用于两个地址范围内的任意行
OK,测试了半天,画个图总结一下。
注意,楼主测试了半天,寻址这个东西。发现坑不是一般的多啊。
楼主总结一下大概这么几条吧。当然也可以看楼主画的那张图了,虽然画的丑点,问题基本都说明了。
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
OK,基础部分就到这里了,下一篇总结一下sed多模式空间和流程控制