关于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区域总体分两 ...
随机推荐
- 自己做的demo--关于HashMap
package com.pb.collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map ...
- 表达式:使用API创建表达式树(6)
一.ConstantExpression:表示具有常量值的表达式.因为表达式应用过程中,参数据多是 Expressions 类型,算是对常量值的一种包装吧. ConstantExpression使用比 ...
- iOS远程消息推送
iOS 推送基础知识 Apple 使用公共密钥数字证书对来自 iOS 应用程序的推送请求进行身份验证,所以您首先需要创建身份验证密钥,并向 Apple 注册它们.我将在下一节中花相当长的篇幅来直接介绍 ...
- JavaScript Date(日期) 对象
日期对象用于处理日期和时间. 如何使用 Date() 方法获得当日的日期. getFullYear()使用 getFullYear() 获取年份. getTime()getTime() 返回从 197 ...
- Long型整数,缄默溢出
/** 长整数问题 @author husky */ public class LongDemo { public static void main(String[] args) { /** * 问题 ...
- 找出整数中第k大的数
一 问题描述: 找出 m 个整数中第 k(0<k<m+1)大的整数. 二 举例: 假设有 12 个整数:data[1, 4, -1, -4, 9, 8, 0, 3, -8, 11, 2 ...
- 了解负载均衡 会话保持 session同步(转)
一,什么负载均衡 一个新网站是不要做负载均衡的,因为访问量不大,流量也不大,所以没有必要搞这些东西.但是随着网站访问量和流量的快速增长,单台服务器受自身硬件条件的限制,很难承受这么大的访问量.在这种情 ...
- paramiko SSH 模块简单应用。
目的:需要ssh链接到Linux主机,执行telnet 命令,抓回显匹配制定内容. ssh --->执行telnet到本地端口--->执行类似 ls 的命令.匹配命令执行后的特定回显字段. ...
- 算法系列之图--DFS
深度优先搜索使用的策略是,只要与可能就在图中尽量“深入”.DFS总是对最近才发现的结点v出发边进行探索,知道该结点的所有出发边都被发现为止.一旦v的所有出发边都被发现了,搜索就回溯到v的前驱结点(v是 ...
- this详解:JAVASCRIPT中的this到底是谁?
语法 this 全局对象 在全局执行上下文(函数之外),this引用的是全局对象. console.log(this.document === document); // true // In web ...