关于sed中的Pattern Space和Hold Space的随笔
- 首先是一部分概念和示例,这部分转自:http://coolshell.cn/articles/9104.html
- Pattern Space
- 第零个是关于-n参数的,大家也许没看懂,没关系,我们来看一下sed处理文本的伪代码,并了解一下Pattern Space的概念:
foreach line in file {//放入把行Pattern_SpacePattern_Space <= line;// 对每个pattern space执行sed命令Pattern_Space <= EXEC(sed_cmd, Pattern_Space);// 如果没有指定 -n 则输出处理后的Pattern_Spaceif (sed option hasn't "-n") {print Pattern_Space}}
- Address
- 第一个是关于address,几乎上述所有的命令都是这样的(注:其中的!表示匹配成功后是否执行命令)
[address[,address]][!]{cmd}
address可以是一个数字,也可以是一个模式,你可以通过逗号要分隔两个address 表示两个address的区间,参执行命令cmd,伪代码如下:
bool bexec = falseforeach line in file {if ( match(address1) ){bexec = true;}if ( bexec == true) {EXEC(sed_cmd);}if ( match (address2) ) {bexec = false;}}
关于address可以使用相对位置,如:
# 其中的+3表示后面连续3行$ sed '/dog/,+3s/^/# /g' pets.txtThis is my catmy cat's name is betty# This is my dog# my dog's name is frank# This is my fish# my fish's name is georgeThis is my goatmy goat's name is adam
- 命令打包
- cmd可以是多个,它们可以用分号分开,可以用大括号括起来作为嵌套命令。下面是几个例子:
$ cat pets.txtThis is my catmy cat's name is bettyThis is my dogmy dog's name is frankThis is my fishmy fish's name is georgeThis is my goatmy goat's name is adam# 对3行到第6行,执行命令/This/d$ sed '3,6 {/This/d}' pets.txtThis is my catmy cat's name is bettymy dog's name is frankmy fish's name is georgeThis is my goatmy goat's name is adam# 对3行到第6行,匹配/This/成功后,再匹配/fish/,成功后执行d命令$ sed '3,6 {/This/{/fish/d}}' pets.txtThis is my catmy cat's name is bettyThis is my dogmy dog's name is frankmy fish's name is georgeThis is my goatmy goat's name is adam# 从第一行到最后一行,如果匹配到This,则删除之;如果前面有空格,则去除空格$ sed '1,${/This/d;s/^ *//g}' pets.txtmy cat's name is bettymy dog's name is frankmy fish's name is georgemy goat's name is adam
- Hold Space
- 接下来,我们需要了解一下Hold Space的概念,我们先来看四个命令:
g: 将hold space中的内容拷贝到pattern space中,原来pattern space里的内容清除
G: 将hold space中的内容append到pattern space\n后
h: 将pattern space中的内容拷贝到hold space中,原来的hold space里的内容被清除
H: 将pattern space中的内容append到hold space\n后
x: 交换pattern space和hold space的内容
这些命令有什么用?我们来看两个示例吧,用到的示例文件是:
$ cat t.txtonetwothree
第一个示例:
$ sed 'H;g' t.txtoneonetwoonetwothree
是不是有点没看懂,我作个图你就看懂了。 
第二个示例,反序了一个文件的行:
$ sed '1!G;h;$!d' t.txtthreetwoone
其中的 ‘1!G;h;$!d’ 可拆解为三个命令
1!G —— 只有第一行不执行G命令,将hold space中的内容append回到pattern space
h —— 第一行都执行h命令,将pattern space中的内容拷贝到hold space中
$!d —— 除了最后一行不执行d命令,其它行都执行d命令,删除当前行
如图: 
附上自己的一点理解:sed有P区(Pattern space)和H区(Hold space),每读取一行就会把内容放入P区,这时如果我们想对之前对内容做些操作,就需要用到H区用于暂存一些数据。
拿上面最后一个图来说,读取第一行,读取one到P区,然后h命令放到H区;
后面依次读取到P区,然后追加到H区,删除P区是为了不输出内容;
读到最后一行,把数据追加到H区,然后用H区的内容替换掉P区,最后输出P区的内容。
关于sed中的Pattern Space和Hold Space的随笔的更多相关文章
- 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 ...
- sed高级用法:模式空间(pattern space)和保持空间(hold space)
摘自:https://blog.csdn.net/ITsenlin/article/details/21129405 sed高级用法:模式空间(pattern space)和保持空间(hold spa ...
- sed修炼系列(四):sed中的疑难杂症
本文目录:1 sed中使用变量和变量替换的问题2 反向引用失效问题3 "-i"选项的文件保存问题4 贪婪匹配问题5 sed命令"a"和"N" ...
- sed中引用变量
sed 中引用变量 eval sed 's/string/$REPLACE/g' file awk 中引用变量 awk 在匹配字符串的时候,有时候需要需要引用变量. $pid= eval " ...
- sed 中带变量的情况
#teststr="IBM" #sed -n '/' "$teststr" '/=' testfile.txt 在sed中使用变量 通常,我们使用sed进行变量 ...
- sed中使用变量及变量中存在特殊字符‘/’处理
sed中使用变量,普通的处理方式无法解析变量 如当前file文件中存在字符串pedis,现将其替换为redis [root@localhost work]# cat file pedis 如下两种替换 ...
- sed中使用shell变量
假设希望在 file_to_modified 文件最后新增一行以下信息:传入 shell 脚本文件的第一个参数,以及当前时间(YYYY-MM-DD HH:MMS) date "+%Y-%m- ...
- 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区域总体分两 ...
随机推荐
- (转)兼容主流浏览器的CSS透明代码
透明往往能产生不错的网页视觉效果下面是兼容主流浏览器的CSS透明代码.transparent_class { filter:alpha(opacity=50); -moz-opacity:0.5; - ...
- WisDom.Net 框架设计(三) 数据缓存
WisDom.Net --数据缓存 1.几种缓存方式 1.静态全局变量 C#静态变量使用 static 修饰符进行声明,在类被实例化时创建,通过类进行访问不带有 static 修饰符声明 ...
- CSS3新增Hsl、Hsla、Rgba色彩模式以及透明属性(转)
CSS2中色彩模式只有RGB色彩模式(RGB即RED.Green.BLue)和十六进制(Hex)模式,为了能支持 透明opacity 的Alpha值,CSS3又增加了RGBA色彩模式(RGBA即RED ...
- Length 和 Width在矩形中的定义.
Length is the longer or longest dimension of a rectangle (or even an object). Ref:http://mathforum.o ...
- SQLite 入门教程(四)增删改查,有讲究
增删改查操作,其中增删改操作被称为数据操作语言 DML,相对来说简单一点. 查操作相对来说复杂一点,涉及到很多子句,所以这篇先讲增删改操作,以例子为主,后面再讲查操作. 一.插入数据 INSERT I ...
- 解决Xcode7多个模拟器的方法
xcode模拟器都这样显示,没办法判断是哪个系统,解决办法是 1.关闭xcode 2.终端输入 sudo killall -9 com.apple.CoreSimulator.CoreSimulato ...
- C#入门经典(第五版)学习笔记(三)
---------------面向对象编程简介--------------- UML表示方法: 1)方框上中下三分 2)上框写类名 3)中框写属性和字段,例如:+Description:string ...
- Linux数据写操作改进
Linux的IO操作中数据的写函数int nwrite = write(int fd,void* buf ,int len)表示向fd文件描述符写入len个字节长度的数据报文,但是这并不能保证真正向内 ...
- Singleton 模式
个人认为 Singleton 模式是设计模式中最为简单.最为常见.最容易实现,也是最应该熟悉和掌握的模式.且不说公司企业在招聘的时候为了考察员工对设计的了解和把握,考的最多的就是 Singleton ...
- Valid Phone Numbers
Given a text file file.txt that contains list of phone numbers (one per line), write a one liner bas ...