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 is inserted into the pattern buffer (pattern space). Pattern buffer is like the temporary buffer, the scratchpad where the current information is stored. When you tell sed to print, it prints the pattern buffer.
Hold buffer / hold space is like a long-term storage, such that you can catch something, store it and reuse it later when sed is processing another line. You do not directly process the hold space, instead, you need to copy it or append to the pattern space if you want to do something with it. For example, the print command p prints the pattern space only. Likewise, s operates on the pattern space.
Here is an example:
sed -n ‘1!G;h;$p’
(the -n option suppresses automatic printing of lines)
There are three commands here: 1!G, h and $p. 1!G has an address, 1 (first line), but the ! means that the command will be executed everywhere but on the first line. $p on the other hand will only be executed on the last line. So what happens is this:
first line is read and inserted automatically into the pattern space
on the first line, first command is not executed; h copies the first line into the hold space.
now the second line replaces whatever was in the pattern space
on the second line, first we execute G, appending the contents of the hold buffer to the pattern buffer, separating it by a newline. The pattern space now contains the second line, a newline, and the first line.
Then, h command inserts the concatenated contents of the pattern buffer into the hold space, which now holds the reversed lines two and one.
We proceed to line number three – go to the point (3) above.
Finally, after the last line has been read and the hold space (containing all the previous lines in a reverse order) have been appended to the pattern space, p 大专栏 pattern space and hold space of sedattern space is printed with p. As you have guessed, the above does exactly what the tac command does – prints the file in reverse.
—- translation —-
当 sed 从文件中一行一行的读取时,当前被读取的那一行会被插入到 pattern buffer(pattern space)。pattern buffer 就像是一个临时性的缓冲区,中间结果寄存器就是把当前的信息先暂存到里面。当你通知 sed 去打印的时候,它打印的就是 pattern buffer。
Hold buffer / hold space 更像是一个长期的寄存器,你可以捕获信息,存储并且过后再重用它们当 sed 在处理另一行的时候。你不可能直接操作 hold space,然而,如果你想要用它干点什么的时候可以拷贝它并把它追加到 pattern space 。举例来说,打印命令 p 只是将 pattern space 打印出来。相同的,s 命令只是在 pattern space 之上进行操作。
咱们来实际操作一下:
sed -n ‘1!G;h;$p’
(-n 选项就是取消了自动打印)
这里有三个命令:1!G, h and $p. 1!G 有一个 address,1(第一行),但是 ! 意味着命令可以在任何地方执行出了第一行。$p 与之不同只会在最后一行执行。实际过程是这样的:
第一行被读取并自动插入到了 pattern space
在第一行,第一条命令并没有被执行;h 将第一行拷贝到 hold space。
现在第二行取代了 pattern space 中的内容
在第二行,我们首先执行 G,追加 hold buffer 中的内容到 pattern buffer,用一个换行符将其分割。pattern space 中现在包含第二行,一个换行符,还有第一行。
接下来,h 命令将已经连接在一起的 pattern buffer 插入到 hold space,那里现在保存的是倒序的第二行和第一行。
之后我们继续处理第三行 -- 重复上面的第三步。
最终,在最后一行被已经读取并且 hold space(包含着所有倒序的行)已经被追加到了 pattern space 之后,pattern space 被 p 打印出来。正如你所预料的,以上正是 tac 命令所做的事情 – 倒序打印文件。
pattern space and hold space of sed的更多相关文章
- 关于sed中的Pattern Space和Hold Space的随笔
首先是一部分概念和示例,这部分转自:http://coolshell.cn/articles/9104.html Pattern Space 第零个是关于-n参数的,大家也许没看懂,没关系,我们来看一 ...
- sed高级用法:模式空间(pattern space)和保持空间(hold space)
摘自:https://blog.csdn.net/ITsenlin/article/details/21129405 sed高级用法:模式空间(pattern space)和保持空间(hold spa ...
- User space 与 Kernel space
学习 Linux 时,经常可以看到两个词:User space(用户空间)和 Kernel space(内核空间). 简单说,Kernel space 是 Linux 内核的运行空间,User spa ...
- JVM内存区域划分Eden Space、Survivor Space、Tenured Gen,Perm Gen解释
以下内容转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=29632145&id=4616836 jvm区域总体分两 ...
- JVM内存区域划分Eden Space、Survivor Space、Tenured Gen,Perm Gen解释(转)
jvm区域总体分两类,heap区和非heap区.heap区又分:Eden Space(伊甸园).Survivor Space(幸存者区).Tenured Gen(老年代-养老区). 非heap区又分: ...
- JVM内存区域划分Eden Space,Survivor Space,Tenured Gen,Perm Gen
jvm区域总体分两类,heap区和非heap区.heap区又分:Eden Space(伊甸园).Survivor Space(幸存者区).Tenured Gen(老年代-养老区). 非heap区又分: ...
- JVM内存区域详解(Eden Space、Survivor Space、Old Gen、Code Cache和Perm Gen)
JVM区域总体分两类,heap区和非heap区.heap区又分为: Eden Space(伊甸园). Survivor Space(幸存者区). Old Gen(老年代). 非heap区又分: Cod ...
- Permanent Space 和 Heap Space
JVM堆内存 JVM堆内存分为2块:Permanent Space 和 Heap Space. Permanent 即 持久代(Permanent Generation),主要存放的是Java类定 ...
- 法线从object space到eye space的转换((normal matrix)
对于顶点来说,从object Space转换到eye space, 使用model-view矩阵就好了.那么顶点的法线是否也可以直接使用model-view矩阵转化? 通常情况下是不行的. 如下两张图 ...
随机推荐
- 了解SSL证书从HTTPS开始 开发者绕不开的“劫”
微信小程序上线已经有很长一段时间了,而开发者在接入小程序的过程中,会遇到一些问题,例如小程序要求必须通过HTTPS完成服务端通信,开发者需搭建HTTPS服务,进行 SSL 证书申请.部署,完成HTTP ...
- SAP AM:固定资产采购的预算管理
对于很多公司来说,购买资产是公司年度支持的主要部分,因此需要用预算管理来防止过度支出.这项支出被列为资本支出,所以很多公司都需要对购买过程和安全防范进行良好的控制.以下文中说明如何在购买资产时使用预算 ...
- Andorid Studio 3.1 引入第三方jar包的方法
今天手痒,把android studio 从3.0升级到3.1.2 发现很多问题 1.发现编译会下载好多东西,等半天 2.之前的jar包导不进来了 针对jar包导入不成功,我查了一下说是不支撑comp ...
- c语言中fflush的运用为什么没有效果呢,测试平台linux
/************************************************************************* > File Name: clearing. ...
- HTTP1.0和HTTP1.1的一些区别
HTTP1.0和HTTP1.1的一些区别 HTTP1.0最早在网页中使用是在1996年,那个时候只是使用一些较为简单的网页上和网络请求上,而HTTP1.1则在1999年才开始广泛应用于现在的各大浏览器 ...
- 传输层TCP和UDP
TCP协议 传输控制协议 TCP是面向连接.可靠的进程到进程通信的协议 TCP提供全双工工服务,即数据可在同一时间双向传输 三次握手: ...
- Winform下编译Dev控件时提示license.licx文件错误
有时候,用vs2005或2008,用到第3方控件的时候会自动生成licenses.licx.我用的是devexpress.在程序运行的时候总是出现dev的画面,很烦.在网上找了找,找到去掉画面的方法: ...
- 用Kinect为听障人士架一座沟通的桥梁
编者按:这是微软亚洲研究院和中国科学院共同进行的一个合作项目,希望通过使用Kinect来帮助提升手语的识别率,从而为听力受损的残障人士(以下简称听障人士)架起一座与外界沟通的桥梁. 文章译自:Digi ...
- Invert Binary Tree(easy)
1.直接把递归把左右子树翻转即可 AC代码: /** * Definition for a binary tree node. * struct TreeNode { * int val; * Tre ...
- Zabbix 监控sqlserver
转:Zabbix 监控sqlserver 一:Zabbix监控sqlserver 方法一: 1.思路整理 1.在zabbix server上安装Freetds.unixODBC.unixODBC-de ...