shell脚本学习笔记 (sed的高级用法----模式空间和保持空间)
2016-04-29 00:04
916 查看
前段时间在学习shell脚本,上次有提到sed的模式空间和保持空间概念,但是一直没有研究好,这两天研究了一下,所以将它发出来,不是很全面,仅仅供大家参考一下。
保持空间sed在正常情况下,将处理的行读入模式空间,脚本中的“sed command(sed命令)”就一条接着一条进行处理,直到脚本执行完毕。然后该行被输出,模式被清空;接着,在重复执行刚才的动作,文件中的新的一行被读入,直到文件处理完毕。
模式空间可以比喻为一个生产线,而保持空间则可以被比喻为仓库,这个比喻希望可以帮助大家理解两者的关系。
sed的指令中用来操作保持空间和模式空间的常见的有一下
为了方便,在下面用P来表示模式空间,M来表示保持空间
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的和了。
以上就是我对保持空间和模式空间的一些理解以及对操作两个空间的一些指令的使用,可能使用上面的指令可以实现更多的功能,但是我在这里家就不一一介绍了,这部分确实挺考验脑力的。大家感兴趣的话可以再去多多研究研究,实现更多的功能。
保持空间sed在正常情况下,将处理的行读入模式空间,脚本中的“sed command(sed命令)”就一条接着一条进行处理,直到脚本执行完毕。然后该行被输出,模式被清空;接着,在重复执行刚才的动作,文件中的新的一行被读入,直到文件处理完毕。
模式空间可以比喻为一个生产线,而保持空间则可以被比喻为仓库,这个比喻希望可以帮助大家理解两者的关系。
sed的指令中用来操作保持空间和模式空间的常见的有一下
为了方便,在下面用P来表示模式空间,M来表示保持空间
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脚本
- hbase的shell操作和java操作
- Apache OpenMeetings 会议系统getshell初探 - 2016-04-28 16:48
- Linux Shell 04 数字/字符串/文件测试
- Shell编程基础
- Smallp0wnedShell发布——Small modification version of p0werShell
- Shell编程入门总结(一)
- Linux Shell 06 数学运算
- Linux Shell 05 位置变量(命令行参数)
- linux BASH_SOURCE[0]
- Shell脚本学习笔记(一)
- LINUX-SHELL之数字运算
- 解决Xshell等Linux终端连接MySQL中文乱码问题
- Linux-SHELL中sh和bash的区别
- shell 编程实例学习
- Linux-Shell脚本中单引号和双引号区别
- shell下的单引号与双引号
- shell 脚本文件Windows传到Linux后编码问题
- Linux shell脚本的字符串截取
- Linux下使Shell 命令脱离终端在后台运行