注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

涅槃

文档收藏

 
 
 

日志

 
 
 
 

【转】sed的Pattern space和Hold space  

2012-04-05 16:40:32|  分类: awk&sed |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Sed是对数据流进行操作的一个强大的工具,大家已经经常使用到sed对文本进行修改,替换。这里就不介绍sed的使用方法了,本文主要介绍sed中的Pattern space和Hold space。理解了这两个概念有助于从本质上理解sed处理数据流的方式,尤其是像实现逆转、只输出奇数或偶数行等等功能,Pattern space和Hold space即模式空间和保留空间(也可以称之为缓冲区),保留空间的初始为空,我们可以认为是一个空行。下面图示了sed中的输入流,输出流,模式空间以及保留空间:

【转】sed的Pattern space和Hold space - c20031776 - 涅槃

先简单介绍下sed的一般工作模式(在没有利用到Hold space的时候),pattern space每次从input中取一行数据到pattern space中,然后经过一些处理,将一行数据放入output中,然后output会输出到屏幕(默认为屏幕,也可以是文件)。记住,此时pattern space还储存着这一行数据,直到input再放入第二行数据取代第一行数据。

当sed的命令为sed [-n] [hHgGx]pfile格式时,需要涉及到hold space,其实我们可以简单的讲hold space理解为sed的一个缓冲区就好了,只是这个缓冲区不会直接进行输出,并且只有pattern space可以对其进行操作,放入或者拿出数据(如上图所示)。

 下面解释下[hHgGx]这几个参数:(以file做例子,file中的数据为:【转】sed的Pattern space和Hold space - c20031776 - 涅槃

Man sed中的解释为:

h/H:copy/append pattern space to hold space(复制或者追加模式空间的数据至保留空间);

g/G:copy/append hold space to pattern space(复制或者追加保留空间的数据至模式空间);

x:exchange the contents of pattern space and hold space(交换模式空间和保留空间的数据);

一般会将h/H和g/G以及x联合起来用,可以达到栈和队列的使用目的。

G:sed 'G' file【转】sed的Pattern space和Hold space - c20031776 - 涅槃

因为hold space的初始为一个空行,并且始终没有修改其中的数据,一直保持的是空行,所以在每次执行G命令时,会将空行追加到每行数据之后。

x:sed 'x;G' file
【转】sed的Pattern space和Hold space - c20031776 - 涅槃

因为开始x命令将hold space的空行和pattern space中的111111111交换,然后G命令又将111111111追加到pattern apace的空行之后,然后输出了【转】sed的Pattern space和Hold space - c20031776 - 涅槃
,此时hold space中依旧为111111111,接着pattern space中进入22222222,x命令将hold space的111111111和pattern space中的22222222交换,然后G命令又将22222222追加到pattern apace的111111111之后,然后输出了【转】sed的Pattern space和Hold space - c20031776 - 涅槃
依次类推,就输出了结果。


h:sed 'h;G' file
【转】sed的Pattern space和Hold space - c20031776 - 涅槃

命令进行操作的思路,大家可以参照x命令的方法进行一步步的演示。

H:sed 'H;x' file
【转】sed的Pattern space和Hold space - c20031776 - 涅槃

g:sed '1h;g;x' file
【转】sed的Pattern space和Hold space - c20031776 - 涅槃

下面解释下'1h;g;x'中“1“的含义,表示只有第一行执行h命令,将111111111复制到hold space中去,之后每次执行g命令的时候,都是从hold space中将111111111复制出来,覆盖掉了pattern space中的数据,所以结果显示为打印了9行111111111。

$表示只有最后一行执行这个命令。

在1或$和命令中添加“!“,表示只有第一行或者最后一行不执行这个命令。

有关于更改多的命令n/N、d/D等,请大家自己查阅man sed或者其他资料。在遇到复杂的命令的时候,希望大家可以手动进行画图来执行每个命令,这样就比较清楚了。

下面有4个例子来解释下选项n的作用:

1. sed '' file,这句命令会将output中的数据进行输出:
【转】sed的Pattern space和Hold space - c20031776 - 涅槃

2. sed -n 'p' file,这句命令虽然显示的结果和上一个一样,但机制是不同的,这句命令是要求输出pattern space中的数据;如果大家觉得这个说法有点模糊,再继续看下面的例子。

3. sed 'p' file,先看结果:
【转】sed的Pattern space和Hold space - c20031776 - 涅槃

这条命令输出了两遍,为什么呢?因为不仅将每次output中的数据进行了输出,接着又将pattern space中的数据再要求输出一次。

4. sed -n '' file,大家应该能猜到这个输出什么结果了,那就是空,因为选项-n指明了要讲pattern space中的数据进行输出,而缺少了p命令,所以不能将pattern space中的数据进行输出。



转自:http://wenku.baidu.com/view/5d6c482b4b73f242336c5f11.html

  评论这张
 
阅读(964)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018