标签:
前段时间在学习shell脚本,上次有提到sed的模式空间和保持空间概念,但是一直没有研究好,这两天研究了一下,所以将它发出来,不是很全面,仅仅供大家参考一下。
保持空间sed在正常情况下,将处理的行读入模式空间,脚本中的“sed command(sed命令)”就一条接着一条进行处理,直到脚本执行完毕。然后该行被输出,模式被清空;接着,在重复执行刚才的动作,文件中的新的一行被读入,直到文件处理完毕。
模式空间可以比喻为一个生产线,而保持空间则可以被比喻为仓库,这个比喻希望可以帮助大家理解两者的关系。
sed的指令中用来操作保持空间和模式空间的常见的有一下
h :把模式空间里的内容复制到暂存缓冲区(保持空间)H :把模式空间里的内容追加到暂存缓冲区(保持空间)g :把暂存缓冲区里的内容复制到模式空间,覆盖原有的内容G:把暂存缓冲区的内容追加到模式空间里,追加在原有内容的后面d: 删除pattern中的所有?行,并读入下一新行到P中
D:D 删除M ,P中的第一行,不读入下一行
x:交换保持空间和模式空间的内容
下面我就用具体事例来介绍一下用法吧:
1.实现tac功能
其中 1!G 表示第一行不使用G,$!d 表示最后一行不使用d,其执行工程大概是这样的:
上图就是数据在两个空间的转换过程,不知道大家看懂了没,其中该行标有d的表示d操作(删除模式空间的内容),标有G的表示G操作(将内容追加到模式空间,这个操作不会覆盖原有内容),标有h的表示h操作(将模式空间内容复制到保持空间,这个会覆盖原有内容)。最后的结果和我们看到的结果一致。
2.行列转化
我解释一下上面的语句吧,H表示吧模式空间的内容追加到保持空间,${...} 表示最后执行,意思是最后才执行{ }里面的内容,所以最后的时候保持空间里面的内容和cat的内容一致,x 表示交换保持空间和模式空间的内容,那么此时模式空间里的内容就是cat的内容了,此时再使用 "s/p1/p2/g" 替换命令,将换行符\n,替换成空格,这样列就变成行了,反之道理一样。
3.求1~10的和(1~10比较少,观察起来比较方便,求1~100的和也是很简单的)
seq的功能是列出1~n的数:
首先: H---追加到保持空间
其次: ${x;s/\n/+/g;s/^+//;p} ---- 最后一行执行(因为${} );交换保持空间和模式空间的内容;将\n替换成+;最后使用bc计算器就可以求出1~10的和了。
以上就是我对保持空间和模式空间的一些理解以及对操作两个空间的一些指令的使用,可能使用上面的指令可以实现更多的功能,但是我在这里家就不一一介绍了,这部分确实挺考验脑力的。大家感兴趣的话可以再去多多研究研究,实现更多的功能。
shell脚本学习笔记 (sed的高级用法----模式空间和保持空间)
标签:
原文地址:http://blog.csdn.net/zr1076311296/article/details/51277915