摘自:https://blog.csdn.net/wanglelelihuanhuan/article/details/51591809

sed的模式空间和保持空间

2016年06月06日 17:15:07 wanglelelihuanhuan 阅读数:3022 标签: shell脚本sed 更多
所属专栏: 王乐乐

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的模式空间与保持空间

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

  2. sed 之 模式空间 & 保持空间

    模式空间:容纳当前输入行的缓冲区: 保持空间:作为辅助的一个缓冲区,可以和模式空间进行交互,但是命令不能直接作用于保持空间. 由上面定义可以知道,模式空间和保持空间是两个独立的缓冲区,可以进行交互,命 ...

  3. 在Linux用户空间做内核空间做的事情

    导读 我相信,Linux 最好也是最坏的事情,就是内核空间(kernel space)和用户空间(user space)之间的巨大差别.如果没有这个区别,Linux 可能也不会成为世界上影响力最大的操 ...

  4. Linux用户空间与内核空间(理解高端内存)

    Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数 ...

  5. Linux用户空间与内核空间

    源:http://blog.csdn.net/f22jay/article/details/7925531 Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针 ...

  6. linux 用户空间与内核空间——高端内存详解

    摘要:Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对 ...

  7. linux内核空间和用户空间详解

    linux驱动程序一般工作在内核空间,但也可以工作在用户空间.下面我们将详细解析,什么是内核空间,什么是用户空间,以及如何判断他们.Linux简化了分段机制,使得虚拟地址与线性地址总是一致,因此,Li ...

  8. linux用户空间和内核空间(内核高端内存)_转

    转自:Linux用户空间与内核空间(理解高端内存) 参考: 1. 进程内核栈.用户栈 2. 解惑-Linux内核空间 3. linux kernel学习笔记-5 内存管理   Linux 操作系统和驱 ...

  9. 如何看待Linux操作系统的用户空间和内核空间

    作为中央核心处理单元的CPU,除了生产工艺的不断革新进步外,在处理数据和响应速度方面也需要有权衡.稍有微机原理基础的人都知道Intel X86体系的CPU提供了四种特权模式ring0~ring3,其中 ...

随机推荐

  1. SpringMVC-Spring-Hibernate项目搭建之三-- freemarker & 静态资源整合

    一. 前段目录结构如下架构如下: 二. freemarker文件配置 在 web.xml 文件中指定 spring 配置文件的位置 三. 配置springmvc-servlet.xml文件 1)配置自 ...

  2. java代码---indexOf()方法

    总结:indexOf(String str,int index)方法.从参数指定位置开始,如果index值超过了字符串长度,则返回-1 package com.a.b; import java.io. ...

  3. windows python文件拷贝到linux上执行问题-换行符问题/r/n

    之前在Windows下写好了一个Python脚本,运行没问题,今天在Linux下,脚本开头的注释行已经指明了解释器的路径,也用chmod给了执行权限,但就是不能直接运行脚本. 1 问题1: 报错:: ...

  4. dede_CMS模板的基础安装

    今天来给大家讲一讲dede_CMS的基础使用方法 那么什么是CMS呢 cms (content manage system 内容管理系统): 比如 新闻/电子商务/电影网/公司宣传网站/软件/文章) ...

  5. java死锁及解决方案

    死锁是两个甚至多个线程被永久阻塞时的一种运行局面,这种局面的生成伴随着至少两个线程和两个或者多个资源.避免死锁方针:a:避免嵌套封锁:这是死锁最主要的原因的,如果你已经有一个资源了就要避免封锁另一个资 ...

  6. Java多线程面试问题集锦

    参看:http://www.importnew.com/1428.html

  7. 搭建psdash 监控系统

    一.监控系统介绍 Psdash 是一款查看 Linux 系统信息的 web 面板,和另一款系统监控工具 Glances 一样,psDash 的系统信息的采集也是由 psutil 完成的.和 Glanc ...

  8. OD 实验(三) - 破解程序的文件验证

    需要破解的程序 双击程序,提示需要许可证文件 逆向程序 用 OD 打开 LoadIconA 为加载图标 LoadCursorA 为加载鼠标 F8 走一下程序 走到了这里,调用了 CreateFileA ...

  9. Julia - 三元运算符

    三元运算符的格式: a ? b : c a 是条件表达式,如果条件 a 为真,就执行 b:如果条件 a 为假,就执行 c 二选一 julia> println(1 < 2 ? " ...

  10. 基于OpenCV读取摄像头进行人脸检测和人脸识别

    前段时间使用OpenCV的库函数实现了人脸检测和人脸识别,笔者的实验环境为VS2010+OpenCV2.4.4,opencv的环境配置网上有很多,不再赘述.检测的代码网上很多,记不清楚从哪儿copy的 ...