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

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

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

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

命令含义:

h,将当前模式空间中的内容覆盖到 保持空间中,

n,用于提前读取下一行,并且覆盖当前模式空间中的这一行

H,将当前模式空间中的内容追加到 保持空间 中

x,交换模式空间和保持空间中的内容

g,将保持空间中的内容拷贝到模式空间中,原来模式空间里的内容清除。

d,删除模式空间中的所有行,并读入下一新行到模式空间中。
D,删除multiline pattern中的第一行,不读入下一行。

通过几个例子看sed的模式空间和保持空间
例子一
sed G 在文档每一行下面输出一个空行
代码:
$ cat foo
11111111111111
22222222222222
33333333333333
44444444444444
55555555555555
$ sed G foo
11111111111111

22222222222222

33333333333333

44444444444444

55555555555555

解释:sed 中 G 的用法
The G function appends the contents of the holding area to the contents of the pattern space. The former and new contents are separated by a newline. The maximum number of addresses is two.
hold space : 保持空间(或叫保留空间、缓冲区),初始为空
pattern space :模式空间
在上面的例子中,将为空的hold space附加到文档的每一行后面,所以结果是每一行后面多了一个空行
引申出:
sed '/^$/d;G'
在文档的每一个非空行下面输出一个空行
sed '/^$/d;G;G'
在文档的每一个非空行下面输出两个空行
代码:
$ cat foo
11111111111111
22222222222222
33333333333333
44444444444444
55555555555555
$ sed '/^$/d;G' foo
11111111111111

22222222222222

33333333333333

44444444444444

55555555555555
注:有时会有一些由空格符或TAB组成的空行,前面的正则式 ^$ 就不能匹配到这样的行,则能够这样
sed '/[[:space:]]/d;G' 对于KSH则为 sed '/^ *$/d'

例子二
sed '/regex/{x;p;x;}'
在匹配regex的任何行前面插入一个空行
代码:
$ cat foo
11111111111111
22222222222222
test33333333333
44444444444444
55555555555555

$ sed '/test/{x;p;x;}' foo
11111111111111
22222222222222

test33333333333
44444444444444
55555555555555
解释:sed 中 x 的用法
The exchange function interchanges the contents of the pattern space and the holding area. The maximum number of addresses is two.
即交换保持空间hold space和模式空间pattern space的内容
sed 中 p 的作用是把模式空间复制到标准输出。
分析一下该命令执行过程中保持空间和模式空间的内容
命令 保持空间 (holdspace) 模式空间(patternspace)
x 执行前:null 执行后:test...$ 执行前:test...$ 执行后:null
p 执行前:null 执行后:test...$ 执行前:test...$ 执行后:null 输出一个空行
x 执行前:test...$ 执行后:null 执行前:null 执行后:test...$
个人觉得上面的命令执行分析有点问题,我的分析如下:
命令 模式空间(patternspace) 保持空间 (holdspace)
x 执行前:test...$ 执行后:null 执行前:null 执行后:test...$
p 执行前:null 执行后:null但输出一空行 执行前:test...$ 执行后:test...$
x 执行前:null 执行后:test...$ 执行前:test...$ 执行后:null
引申:能够试验一下 sed '/test/{x;p;}' foo 或 sed '/test/{p;x;}' foo 等,看看结果,体会两个空间的变化

相应的:
sed '/regex/G' 是在匹配regex的任何行下面输出一个空行
sed '/regex/{x;p;x;G;}' 是在匹配regex的任何行前面和下面都输出一个空行

例子三
sed 'n;G;' 在文档的偶数行下面插入一个空行
代码:
$ cat foo
11111111111111
22222222222222
33333333333333
44444444444444
55555555555555
$ sed 'n;G;' foo
11111111111111
22222222222222

33333333333333
44444444444444

55555555555555
解释:sed 中 n 的用法:将模式空间拷贝于标准输出。用输入的下一行替换模式空间。
==::执行n 以后将第一行输出到标准输出以后,然后第二行进入模式空间,根据前面对G的解释,会在第二行后面插入一个空行,然后输出;再执行n 将第三行输出到标准输出,然后第四行进入模式空间,并插入空行,依此类推....
相应的:
sed 'n;n;G' 表示在文档的第 3,6,9,12,... 行后面插入一个空行
sed 'n;n;n;G' 表示在文档的第 4,8,12,16,... 行后面插入一个空行
sed 'n;d' 表示删除文档的偶数行

例子四
sed '$!N;$!D' 输出文档最后2行,相当于 tail -2 foo
代码:
$ cat foo
11111111111111
22222222222222
33333333333333
44444444444444
55555555555555
$ sed '$!N;$!D' foo
44444444444444
55555555555555
解释:
D 删除模式空间内第一个newline 字母/n 前的资料。
N 把输入的下一行添加到模式空间中。
sed '$!N;$!D' : 对文档倒数第二行以前的行来说,N 将当前行的下一行放到模式空间中以后,D 就将模式空间的内容删除了(补充一点:D是将模式空间的的第一行删除);(循环删除到模式空间里只剩下倒数第二行时)到倒数第二行的时候,将最后一行附加到倒数第二行下面,然后最后一行不执行 D ,所以文档的最后两行都保存下来了。
更有 N 的另外一种用法代码:
$ sed = foo | sed N (一定要这样的命令格式)
1
11111111111111
2
22222222222222
3
33333333333333
4
44444444444444
5
55555555555555
$ sed = foo | sed 'N;s//n/ /'
1 11111111111111
2 22222222222222
3 33333333333333
4 44444444444444
5 55555555555555
解释:N 的作用是加上行号,能够用于格式化输出文档

例子五
sed '1!G;h;$!d'
sed -n '1!G;h;$p'
将文档的行反序显示,相当于 tac 命令(有些平台没有这个命令)
代码:
$ cat foo
11111111111111
22222222222222
33333333333333
$ sed '1!G;h;$!d' foo
33333333333333
22222222222222
11111111111111
$ sed -n '1!G;h;$p' foo
33333333333333
22222222222222
11111111111111
解释:sed 中 h 用法:h
The h (hold) function copies the contents of the pattern space into a holding area, destroying any previous contents of the holding area. 意思是将模式空间的内容保存到保持空间中去
sed 中的 d 表示删除模式空间。
1!G表示除了第一行以外,其余行都执行G命令;$!d表示除了最后一行以外,其余行都执行d命令。
看一下sed '1!G;h;$!d'命令执行过程中保持空间和模式空间的变化:
命令 保持空间 模式空间
第一行 h;d 执行前:null 执行后:11..$ 执行前:11..$ 执行后:null
第二行 G;h;d 执行前:11..$ 执行后:22..$/n11..$ 执行前:22..$ 执行后:null
第二行 G;h 执行前:22..$/n11..$执行后:33..$/n22..$/n11..$ 执行前:33..$ 执行后:33..$/n22..$/n11..$
这样输出以后就是文档的反序了。

题外话:在vi中对一个文档进行反序显示的命令是 :g/./m0 , 意思是按照文档正常顺序每找到一行,就把该行放到文档的最上面一行去,这样循环一下正好把文档的行反序显示了。

参考http://www.xuebuyuan.com/951950.html

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

sed 模式空间 保持空间的更多相关文章

  1. Oracle用户和模式,表空间

    oracle 用户与表空间关系 oracle用户与表空间关系用户=商家表=商品表空间=仓库1. 1个商家能有很多商品,1个商品只能属于一个商家2. 1个商品可以放到仓库A,也可以放到仓库B,但不能同时 ...

  2. 【HICP Gauss】数据库 数据库管理(连接方式 会话模式 存储表空间)-6

    数据库连接方式:驱动连接和客户端连接 驱动连接 : JDBC GSC ODBC 客户端连接 zsql工具 zsql / as sysdba -q #管理员身份登陆 zsql omm/ - #普通身份登 ...

  3. linux 用户态和内核态以及进程上下文、中断上下文 内核空间用户空间理解

    1.特权级         Intel x86架构的cpu一共有0-4四个特权级,0级最高,3级最低,ARM架构也有不同的特权级,硬件上在执行每条指令时都会对指令所具有的特权级做相应的检查.硬件已经提 ...

  4. 机器学习-学习笔记(一) --> (假设空间 & 版本空间)及 归纳偏好

    机器学习 一.机器学习概念 啥是机器学习 机器学习:假设用P来评估计算机程序在某任务类T上的性能,若一个程序通过利用经验E在T中任务上获得了性能改善,则关于T和P,该程序对E进行了学习 通俗讲:通过计 ...

  5. "微空间"免费空间很棒哦,很适合中小网站站长

    “微空间”(www.idcbt.com)是最长久的免费云主机 现在在站长圈子里面非常火爆的“微空间”免费空间网(www.idcbt.com)犹如火山爆发一样,瞬间成为了广大站长津津乐道的免费主机空间. ...

  6. python面向对象:类空间,对象空间, 组合

    一. 类空间,对象空间 1. 类空间,对象空间 创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性 而类有两种属性:静态属性和动态属性 静态属性就是直接在类中定义的变 ...

  7. Oracle起步---创建临时表空间/表空间/创建用户/授权

    1. 安装: 百度一下你就知道 2. sqlplus登录/sqlplus命令登录 在安装Oracle时,你需要记住设置的“全局数据库名”(默认为orcl) 和 口令,在以两种方式登录时: 用户名: s ...

  8. CentOS7使用LVM缩减/home空间,扩大/空间

    CentOS7使用LVM缩减/home空间,扩大/空间方法:把/home里的内容备份,然后将/home文件系统所在的逻辑卷删除,扩大/文件系统.新建/home,恢复/home的原内容1.查看默认分区[ ...

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

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

随机推荐

  1. VS2015 up3激活key

    密钥 专业版:HMGNV-WCYXV-X7G9W-YCX63-B98R2 企业版:HM6NR-QXX7C-DFW2Y-8B82K-WTYJV

  2. c++设计模式概述之状态

    代码写的不够规范,目的是为了缩短篇幅,实际中请不要这样做 参看:https://www.runoob.com/design-pattern/state-pattern.html 1.概述 这个有点抽象 ...

  3. 【LeetCode】950. Reveal Cards In Increasing Order 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 模拟 日期 题目地址:https://leetcod ...

  4. 【LeetCode】696. Count Binary Substrings 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:暴力解法(TLE) 方法二:连续子串计算 日 ...

  5. 永中dcs实现浏览器上面的手绘效果

    永中dcs是一款在线预览各种办公文件的网络产品,我们可以只用一个浏览器就可以实现对word,ppt和excel等文件的在线浏览,在其中有一个在线手绘功能很有特色,让我们来探一探它的实现原理吧. 第一, ...

  6. Windows 11实现直播,VLC超简单实现捕获、串流、播放

    上一篇文章说了搭建Nginx的rtmp服务.实现直播功能 期间发现一个更便捷的工具 VLC media play,官方下载:https://www.videolan.org 1.傻瓜式安装,略过 2. ...

  7. HDU 6470:Count(矩阵快速幂)

    Count Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

  8. Scale-Invariant Error

    目录 概 主要内容 代码 Eigen D., Puhrsch C. and Fergus R. Depth Map Prediction from a Single Image using a Mul ...

  9. Java面向对象笔记 • 【第2章 面向对象进阶】

    全部章节   >>>> 本章目录 2.1 成员变量 2.1.1 成员变量与局部变量的区别 2.1.2 成员变量的使用 2.1.3 实践练习 2.2 this关键字 2.2.1 ...

  10. LDAP理解要点

    1.介绍 LDAP(Lightweight Directory Access Protocol)是"轻量级目录访问协议", 是一个用于访问"目录服务器"(Dir ...