转载自:

http://blog.csdn.net/wanglelelihuanhuan/article/details/51591809

sed之所以能以行为单位的编辑或修改文本,其原因在于它使用了两个空间:一个是活动的“模式空间(pattern space)”,另一个是起辅助作用的“保持空间(hold space)这2个空间的使用。

模式空间:可以想成工程里面的流水线,数据之间在它上面进行处理。
保持空间:可以想象成仓库,我们在进行数据处理的时候,作为数据的暂存区域。

正常情况下,如果不显示使用某些高级命令,保持空间不会使用到!

sed在正常情况下,将处理的行读入模式空间,脚本中的“sed command(sed命令)”就一条接着一条进行处理,直到脚本执行完毕。然后该行被输出,模式被清空;接着,在重复执行刚才的动作,文件中的新的一行被读入,直到文件处理完毕。

一般情况下,数据的处理只使用模式空间(pattern space),按照如上的逻辑即可完成主要任务。但是某些时候,通过使用保持空间(hold space),还可以带来意想不到的效果。

sed命令:
+ g:[address[,address]]g 将hold space中的内容拷贝到pattern space中,原来pattern space里的内容清除。

+ G:[address[,address]]G 将hold space中的内容append到pattern space\n后。
+ h:[address[,address]]h 将pattern space中的内容拷贝到hold space中,原来的hold space里的内容被清除。
+ H:[address[,address]]H 将pattern space中的内容append到hold space\n后。
+ d:[address[,address]]d 删除pattern中的所有行,并读入下一新行到pattern中。
+ D:[address[,address]]D 删除multiline pattern中的第一行,不读入下一行。
+ x:交换保持空间和模式空间的内容。

1. 给每行结尾添加一行空行

2.用sed模拟出tac的功能(倒序输出)

1!G:第1行不执行“G”命令,从第2行开始执行。$!d:最后一行不删除(保留最后1行)。

3.追加匹配行到文件结尾

-e :进行多项编辑,即对输入行应用多条sed命令时使用

4.行列转化

-n :取消默认的输出

H表示把pattern space 的内容追加到hold space中去,H可以带一个地址,这里用的是$,表示到文件的末尾,然后用x将之取到pattern space中,把\n替换成空格再打印即可。

5. 行列转化,求1~100的求和


seq 100 ==>竖排打印1...100个数字。

bc    ==>交给bc计算

附:seq命令的语法

1)生成序列[1…LAST]
例:seq 5 表示序列为 1 2 3 4 5

2)生成序列[FIRST…LAST],步长为1

例:seq 2 5表示序列为  2 3 4 5

3)生成序列[FIRST…LAST],步长为INCREMENT

例:seq 2 2 5表示序列为  2 4

6. 打印奇偶数行

附:awk打印奇偶行

方法一:

NR是行号,awk的内建函数,当第一行,NR==1时,对2取余,结果是1,在awk的执行模式里,这个1就是pattern,为真,执行默认的{print},这个action操作。那么打印出该行,到第2行则余数是0,pattern为0,则为假,不会执行默认的{print},则不会输出偶数行。就达到了只输出奇数行的效果,反之则输出偶数行了。

方法二:

这行命令充分的利用了C语言中 ++i 与 i++ 的区别,i++ 中i的值自加一次后这个表达式的结果等于1,但此时i的值仍然为0,i的值在当前表达式中不会改变,++i中i的值自加一次后,i的值是1。第一行时,因为对2取余的时候 i++ 自加一次后的值是1,但 i++ 是把i的自加前的值去对2取余的,0对2取余结果为0,条件为假,到第二行的时候i的值才是上次自加后的值为1,对2取余数为1,pattern为真,则输出第2行,以此类推。++i 则是自加后i的值是1,所以输出的奇数行。

方法三:

方法四:

awk里面有三个built-in function,分别是:and(a, b)按位与,or(a, b)按位或,xor(a, b)按位异或,当FNR为1的时候,就是第一行,1的2进制为0001,与0001按位与,得到结果是0001,0001的结果为真,就打印改行,当FNR为2时二进制表示为0010,那么又与0001相与,结果为0000,条件为假,则不打印。只有当FNR为奇数时,二进制的尾数为1,与0001相与结果才为真,否则结果都为假。即只输出奇数行,非则输出偶数行。

7.求1~100和

:a表示标签a,ba表示跳转到a标签,$表示最后一行,!表示不做后续操作,所以,$!ba表示最后一行不用跳转到a标签,结束此次操作。

sed知识整理:模式空间相关推荐

  1. 【转】 SED多行模式空间

    1. sed执行模板=sed '模式{命令1;命令2}' 即逐行读入模式空间,执行命令,最后输出打印出来 2. 为方便下面,先说下p和P,p打印当前模式空间内容,追加到默认输出之后,P打印当前模式空间 ...

  2. linux sed 空间模式,整理:SED的模式空间与缓冲区及n,N,d,D,p,P,h,H,g,G,x解析...

    sed命令n,N,d,D,p,P,h,H,g,G,x解析 1.sed执行模板=sed '模式{命令1;命令2}' 即逐行读入模式空间,执行命令,最后输出打印出来 2.p打印当前模式空间所有内容,追加到 ...

  3. 通过几个例子看sed的模式空间与保持空间

    SED之所以能以行为单位的编辑或修改文本,其原因在于它使用了两个空间:一个是活动的"模式空间(pattern space)",另一个是起辅助作用的"暂存缓冲区(holdi ...

  4. 打开高效文本编辑之门_Linux sed之模式空间与保留空间

    Linux sed之模式空间保留空间使用案例 声明与简介 sed:Stream Editor文本流编辑器,sed是一个"非交互式的"面向字符流的编辑器.本文主要结合数据以案例形式介 ...

  5. Linux sed 打印模式空间p命令使用案例

    Linux sed p命令使用案例 声明与简介 sed:Stream Editor文本流编辑,sed是一个"非交互式的"面向字符流的编辑器. 本文主要以实际的数据来介绍sed的pr ...

  6. sed模式空间(pattern space)和保持空间(hold space)

    前面的基本用法已经可以满足90%的需要,人个认为想要真正掌握sed,还需要学习一下sed的高级用法,本节就详细讲解一下sed的模式空间和保持空间 前面基本用法中也有提到模式空间,即为处理文件中一行内容 ...

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

    高级命令 之前我们用到的sed命令都是一行一行的进行处理文本的,不过有些时候单行处理可能并不能满足我们的需要,所以sed还提供了多行模式,多行模式的命令主要有NPD这三个, N:读取匹配到的行的下一行 ...

  8. centos7创建asm磁盘_Oracle ASM 磁盘组基础知识整理(收藏版)

    为什么要写这么一篇基础知识呢?还是有那么一点点原因的,不是胡编乱造还真是有真实存在的事件的,前两周里因一套生产环境数据库磁盘不足无法对其进行表空间扩容,需要向存储岗申请存储资源,当存储岗划好资源加完存 ...

  9. 安卓高级面试知识整理

                                                    安卓高级面试知识整理 Android 四大组件:这是一份全面 & 详细的Activity学习指南 ...

最新文章

  1. Github免费中文书《Go入门指南》,带你从零学Go | 极客头条
  2. Tech·Ed 2006博客园聚会
  3. Codeforces round 1083
  4. 在 windows 命令行下快速检测与排除网络故障
  5. DIV布局的设置(水平或者垂直居中)
  6. Java NIO (十四)NIO 和 IO 的区别和适用场景分析
  7. css一行点点点_如何通过一点点创意使CSS成为不可能
  8. .net System.Web.Mail发送邮件
  9. 公用表表达式(CTE)
  10. 无外网情况下RPM方式安装MySQL5.6
  11. Linux的c编程getopt(分析命令行参数)
  12. Cisco实例1—构建高可用性DM×××网络2—方案设计
  13. Linux 内核 颜色,Linux操作系统内核版的表示方法是( )
  14. C#中新建用户控件示例
  15. 墨刀和axure的区别
  16. PPPD chat中文帮助
  17. android appwidget 空间动画,Android学习之AppWidget笔记分享
  18. python计算最大公约数函数_python如何求解两数的最大公约数
  19. Understanding Maximum-a-Posteriori (MAP) Estimation
  20. 北京大学,新增设置数据科学与工程博士点!

热门文章

  1. 【Java并发编程】java高并发的解决方案(一)
  2. 【Redis学习】Redis管理命令总结
  3. Linux - 修改Cent OS系统的的hostname、配置DNS映射
  4. Linux lvs 多端口组成
  5. 计算机语言发展及未来方向
  6. 【bootstrap】使用支持bootstrap的时间插件daterangepicker
  7. CSharpGL(36)通用的非托管数组排序方法
  8. 创建 Robotium 测试工程
  9. 【C#每日一贴】ArrayList 转换成byte数组
  10. C++中extern关键字使用 http://blog.csdn.net/sruru/article/details/7951019