sed(一)单模式空间

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

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

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

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

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

一.概念

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

二.工作原理

举个例子吧。

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

  1. 车间的名字叫模式空间
  2. 文件中的每一行内容是一份原材料
  3. 我这个车间产能有限,一次只能生产一件产品,所以一次,只能输入一行
  4. 原材料进入车间之后,在车间中按照一道道的工序去加工,也就是sed的脚本中的一条条指令。
  5. 原材料在被我们的一道工序加工之前,我们的工序首先要检查一下你这个原材料是否合格,这个过程在sed里面叫做模式匹配,匹配的话就执行工序后的动作。不匹配,则跳过该道工序,然后去执行下一道工序。
  6. 所有的工序都完成后,成品离开车间,也就是处理后的行打印输出。

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

三.模式空间

所谓模式空间,楼主的理解是:不就是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的结构

  1. script是由一条条指令,组成的。
  2. 指令由模式和过程组成。
  3. 模式是由(/)分割的正则表达式,也可以是行号
  4. 过程是一个或多个被执行的动作
  5. 模式其实就是过程作用的地址

看下面的小例子:

五.寻址

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

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

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

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

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

  1. 如果没有指定地址,命令默认作用于全部地址
  2. 如果指定一个地址,命令作用于这个地址匹配的任意行
  3. 如果指定了两个地址,则表示这两个地址之间的范围,命令作用于两个地址范围内的任意行

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多模式空间和流程控制

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

时间: 2024-10-13 02:13:02

sed(一)单模式空间的相关文章

sed 之 模式空间 & 保持空间

模式空间:容纳当前输入行的缓冲区: 保持空间:作为辅助的一个缓冲区,可以和模式空间进行交互,但是命令不能直接作用于保持空间. 由上面定义可以知道,模式空间和保持空间是两个独立的缓冲区,可以进行交互,命令可以寻址模式空间但是不能寻址保持空间. 一.模式空间: 通过模式匹配到的行被读入模式空间中.用来进行进一步的操作:在多行模式中,'\n'可以用来和模式空间(N命令的结果)的任意换行符匹配,单模式空间底部的换行符除外.^匹配多行的首,$匹配多行的尾,不是每行的行首和行尾. 二.保持空间: 可以通过h

sed模式空间和暂存空间的区别

学了sed,觉得模式空间和暂存空间比较乱 整理一下 sed编辑器逐行处理文件,并将输出结果打印到屏幕上.sed命令将当前处理的行读入模式空间(pattern  space)进行处理,sed在该行上执行完所有命令后就将处理好的行打印到屏幕上(除非之前的命令删除了该行),sed处理完一行就将其从模式空间中删除,然后将下一行读入模式空间,进行处理.显示.处理完文件的最后一行,sed便结束运行.sed在临时缓冲区(模式空间)对文件进行处理,所以不会修改原文件,除非显示指明-i选项. 与模式空间和暂存空间

shell脚本学习笔记 (sed的高级用法----模式空间和保持空间)

前段时间在学习shell脚本,上次有提到sed的模式空间和保持空间概念,但是一直没有研究好,这两天研究了一下,所以将它发出来,不是很全面,仅仅供大家参考一下. 保持空间sed在正常情况下,将处理的行读入模式空间,脚本中的"sed command(sed命令)"就一条接着一条进行处理,直到脚本执行完毕.然后该行被输出,模式被清空:接着,在重复执行刚才的动作,文件中的新的一行被读入,直到文件处理完毕. 模式空间可以比喻为一个生产线,而保持空间则可以被比喻为仓库,这个比喻希望可以帮助大家理解

sed 模式空间 保持空间

sed之所以能以行为单位的编辑或修改文本,其原因在于它使用了两个空间:一个是活动的"模式空间(pattern space)",另一个是起辅助作用的"保持空间(hold space)这2个空间的使用. 正常情况下,如果不显示使用某些高级命令,保持空间不会使用到! sed在正常情况下,将处理的行读入模式空间,脚本中的"sed command(sed命令)"就一条接着一条进行处理,直到脚本执行完毕.然后该行被输出,模式空间被清空:接着,在重复执行刚才的动作,文件

sed高级命令及模式空间和交换空间简介

高级命令 之前我们用到的sed命令都是一行一行的进行处理文本的,不过有些时候单行处理可能并不能满足我们的需要,所以sed还提供了多行模式,多行模式的命令主要有NPD这三个,N:读取匹配到的行的下一行追加至模式空间P:打印模式空间开端至\n内容,并追加到默认输出之前D:如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本, 并不会读取新的输入行,而使用合成的模式空间重新启动循环.如果模式空间 不包含换行符,则会像发出d命令那样启动正常的新循环首先还是先看一下N命令的大致流程图,P和D命

sed的模式空间和保持空间

摘自:https://blog.csdn.net/wanglelelihuanhuan/article/details/51591809 sed的模式空间和保持空间 2016年06月06日 17:15:07 wanglelelihuanhuan 阅读数:3022 标签: shell脚本sed 更多 所属专栏: 王乐乐 sed之所以能以行为单位的编辑或修改文本,其原因在于它使用了两个空间:一个是活动的"模式空间(pattern space)",另一个是起辅助作用的"保持空间(h

BootStrap--from表单模式:总结

BootStrap--from表单模式 表单的种类网上很多我不多赘诉,我包表单的模式总结了一下放在一个网页文件里面. 在附件里面:不能传html,改一下格式直接打开就好了 这里主要叙述一下样式什么的 包括大部分表单控件.文本输入域控件,还支持所有 HTML5 类型的输入控件: text.password.datetime.datetime-local.date.month.time.week.number.email.url.search.tel 和 color. 要说的有: 1.状态 焦点状态

单模式串匹配----浅谈kmp算法

模式串匹配,顾名思义,就是看一个串是否在另一个串中出现,出现了几次,在哪个位置出现: p.s.  模式串是前者,并且,我们称后一个 (也就是被匹配的串)为文本串: 在这篇博客的代码里,s1均为文本串,s2均为模式串: 一般地,文本串长度不小于匹配串:(否则无意义) 很显然可以得到一个暴力的做法 : for i : 1~lenth_of_s1 {//枚举匹配串在文本串中的开始位置 for j : 1~lenth_of_s2 if(s2[j]!=s1[i+j-1]) break; if j>lent

PHP 继承,组合,单模式,GUID,等混合实例

<?php header("Content-type: text/html; charset=utf-8"); header('Access-Control-Allow-Origin:*'); $BiaDuak = '************';//定义变量 使用时 echo $BiaDuak; define("accessKeyId","************");//定义常量 使用时 echo accessKeyId; define(