摘自:https://blog.csdn.net/ITsenlin/article/details/21129405

sed高级用法:模式空间(pattern space)和保持空间(hold space)

2014年03月13日 00:54:09 itsenlin 阅读数:12212更多
个人分类: linux

环境:centos 6.4

sed版本:sed-4.2.1-10.el6.x86_64

前面的基本用法已经可以满足90%的需要,人个认为想要真正掌握sed,还需要学习一下sed的高级用法,本节就详细讲解一下sed的模式空间和保持空间

前面基本用法中也有提到模式空间,即为处理文件中一行内容的一个临时缓冲区。处理完一行之后就会把模式空间中的内容打印到标准输出,然后自动清空缓存。

而这里说的保持空间是sed中的另外一个缓冲区,此缓冲区正如其名,不会自动清空,但也不会主动把此缓冲区中的内容打印到标准输出中。而是需要以下sed命令进行处理:

  • d     Delete pattern space.  Start next cycle.    删除pattern space的内容,开始下一个循环.
  • h、 H    Copy/append pattern space to hold space.   复制/追加pattern space的内容到hold space.
  • g、 G    Copy/append hold space to pattern space.   复制/追加hold space的内容到pattern space.
  • x      Exchange the contents of the hold and pattern spaces.    交换hold space和pattern space的内容.

下面以一个例子来说明上面命令的用法,例如有一个文件,我们可以用tac命令反序打印出文件的内容,其实用sed的话也可以实现,这里先将结果列出,再详细讲解

不错就是一行命令就可实现:

sed '1!G;h;$!d' file

通过下面的讲解大家可以了解到sed的处理机制以及处理过程:

说明:

  • 第一行左边为文件内容,箭头所指为sed当前处理的行,右侧为sed命令;
  • 后面三行左侧绿色为模式空间内容,右侧蓝色为保持空间内容。
  • 每次sed只读取文件中一行到模式空间,即每次执行sed命令前,模式空间中只有文件中当前处理行内容,这一点没有在图中表现。
  • 每一行表示一个命令处理完后两个空间中的内容

困为每一步骤都很清楚,所以只把执行的结果以图形表示,不做说明,可以对照前面对sed命令的说明,以加深理解

1,读取文件的行一行"First"进行处理,最后一个命令将模式空间内容删除,所以不会在屏幕上打印内容

2,读取第二行“Sencond”进行处理,最后一个命令将模式空间内容删除,所以不会在屏幕上打印内容

3,读取第三行“three”进行处理,注意sed处理完之后会把,会把模式空间中内容打印到屏幕并自动清空模式空间(这个没在图中表现)

其实这个功能还可以用下面命令实现:

sed -n '1!G;h;$p' file

说明:

-n: 表示不输出sed的处理结果,而想要输出,则需要要显示的用“p”命令

其实sed的高级命令还有几个,可以分为三组,后续有机会再学习其他两组命令:

  1. 处理多行模式空间(N、D、P)。
  2. 采用保持空间来保存模式空间的内容并使它可用于后续的命令(H、h、G、g、x)。
  3. 编写使用分支和条件指令的脚本来更改控制流(:、b、t)。

sed高级用法:模式空间(pattern space)和保持空间(hold space)的更多相关文章

  1. 【转】sed 高级用法

    首先,应该明白模式空间的定义.模式空间就是读入行所在的缓存,sed对文本行进行的处理都是在这个缓存中进行的.这对接下来的学习是有帮助的. 在正常情况下,sed将待处理的行读入模式空间,脚本中的命令就一 ...

  2. fw:sed的高级用法

    转的,找不到原创了.... sed高级用法 <收藏> 首先,应该明白模式空间的定义.模式空间就是读入行所在的缓存,sed对文本行进行的处理都是在这个缓存中进行的.这对接下来 的学习是有帮助 ...

  3. 关于sed中的Pattern Space和Hold Space的随笔

    首先是一部分概念和示例,这部分转自:http://coolshell.cn/articles/9104.html Pattern Space 第零个是关于-n参数的,大家也许没看懂,没关系,我们来看一 ...

  4. 设计模式 - 装饰者模式(Decorator Pattern) Java的IO类 用法

    装饰者模式(Decorator Pattern) Java的IO类 用法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26716 ...

  5. pattern space and hold space of sed

    Copied from: stackoverflow When sed reads a file line by line, the line that has been currently read ...

  6. linux中sed的用法【转】

    sed命令行格式为:         sed [-nefri]  ‘command’  输入文本/文件 常用选项:        -n∶取消默认的输出,使用安静(silent)模式.在一般 sed 的 ...

  7. sed命令用法详解

    sed命令用法 sed是一种流编辑器,它是文本处理中非常有用的工具,能够完美的配合正则表达式使用,功能不同凡响.处理时,把当前处理的行存储在临时缓冲区中,称为『模式空间』(pattern space) ...

  8. makefile高级用法--使用函数

    makefile高级用法--使用函数 分类: C/C++ 使用函数 ———— 在Makefile中可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活和具有智能.make所支持的函数也不算很多, ...

  9. linux:sed高级命令之n、N(转)

    sed的语法格式: sed [option] {sed-command} {input-file} sed在正常情况下,将处理的行读入模式空间(pattern space),脚本中的“sed-comm ...

随机推荐

  1. 问题排查-JVM堆外内存问题排查

    首先确认堆占用 jmap 查看heap内存使用情况 jmap -heap pid 1 可以查看到MetaspaceSize,CompressedClassSpaceSize,MaxMetaSize j ...

  2. 为什么Java程序占用的内存比实际分配给它的要多

    很多人错误的认为运行Java程序时使用-Xmx和-Xms参数指定的就是程序将会占用的内存,但是这实际上只是Java堆对象将会占用的内存.堆只是影响Java程序占用内存数量的一个因素.要更好的理解你的J ...

  3. IT运维的定义

      IT运维是IT管理的核心和重点部分,也是内容最多.最繁杂的部分,该阶段主要用于IT部门内部日常运营管理,涉及的对象分成两大部分,即IT业务系统和运维人员,该阶段的管理内容又可细分为七个子系统:   ...

  4. Java 连接数据库及字符编码

    通过JDBC方式连接MYSQL数据库: public static Connection getConnection(){ String username="root" ; Str ...

  5. Java死锁以及命令检测

    Java每个对象都有一把锁,当前进程使用对象锁1,没有释放该锁,又想要去获取另一把对象锁2,而对象锁2被另外一个线程持有,没有释放,这就很容易出现死锁 1.死锁实例 public class Dead ...

  6. socket通信循环

    server-----------------#!/usr/bin/env python # encoding: utf-8  # Date: 2018/6/5 import socket phone ...

  7. System.Security.Cryptography.CryptographicException: 系统找不到指定的文件

    默认为false 改为true

  8. Mybit错误,提示There is no getter for property named 'tid' in 'class java.lang.String'

    改成 <select id="queryStudentByNum" resultType="student" parameterType="st ...

  9. javascript json数据的处理

    1.前端页面default.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " ...

  10. nginx 代理http配置实例

    #user nginx; worker_processes ; #error_log /var/log/nginx/error.log warn; #pid /var/run/nginx.pid; e ...