SED高级编辑命令

来源:互联网 发布:哈尔滨java培训机构 编辑:程序博客网 时间:2024/05/18 07:26

sed编辑器被称作流编辑器(stream editor),流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。
sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中,并且sed支持正则表达式和扩展正则表达式的使用,这也大大提升了其的实用性,使其成为了当今的LINUX文本处理三剑客。

sed编辑器的工作流程总结如下
(1)从输入文本中读取一行数据到模式空间(pattern space)
(2)在模式空间中根据所提供命令对数据进行匹配
(3)按照命令对数据进行修改
(4)将处理完数据进行输出,在读取下一行数据,如此反复,直至完成全部数据行的处理

这里写图片描述

通过上图可以看到,sed编辑器中还会有一保持空间,其实在日常的使用中,基本的sed语法就能满足大部分的需求,也就牵扯不到保持空间(hold space)的使用,所以一般都不做讨论,但是关于sed的进阶用法,就需要保持空间的支持了,其可以使得脚本代码更加简洁,甚至会有许多的其妙的用法,下面就对sed的高级编辑命名进行介绍。


一.命令介绍

(1)h/H

h: 把模式空间中的内容覆盖至保持空间中

这里写图片描述

H:把模式空间中的内容追加至保持空间中

这里写图片描述


(2)g/G

g: 从保持空间取出数据覆盖至模式空间

这里写图片描述

G:从保持空间取出内容追加至模式空间

这里写图片描述


(3)x

x: 把模式空间中的内容与保持空间中的内容进行互换

这里写图片描述


(4)n/N

n: 读取匹配到的行的下一行覆盖至模式空间

这里写图片描述

N:读取匹配到的行的下一行追加至模式空间

这里写图片描述


(5)d/D

d: 删除模式空间中的行

这里写图片描述

D:如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本, 并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间不包含换行符,则会像发出d命令那样启动正常的新循环

这里写图片描述


(6)P:打印模式空间开端至\n内容,并追加到默认输出之前

这里写图片描述


二. 牛刀小试

其实单一的命令是很好理解的,但难于其组合起来之后的使用,只用对命令有了充分的理解,才能看透多条命令组合所产生的作用。下面我们通过分析几个简单组合命令实例进行练习

(1)sed -n ‘n;p’ FILE

[root@CentOS6 ~]#seq 10 |sed -n 'n;p'246810

由于是初步接触,为了易于理解,我们先模拟出命令运行,再由结果分析其运行过程。通过观察结果,我们发现其输出的结果是:只输出偶数行!
下面分析其运行流程:
1.读取第一行数据到模式空间中
2.(由于n命令)将第二行数据覆盖至模式空间中
3.(由于p命令)输出并清空模式空间内容
4.(由于-n命令)不进行默认输出,读取第三行到模式空间中
这就完成了一次完整的命令流程,直至读取完最后一行,就完成了偶数行输出的效果。

(2)sed ‘1!G;h;$!d’ FILE

[root@CentOS6 ~]#seq 10 |sed '1!G;h;$!d'

这次我们来运行一个较复杂的例子,来试着分析其作用
1.读取第一行数据到模式空间中
2.(由于1!G命令)命令作用范围为非第一行,对本次操作无效,暂时忽略
3.(由于h命令)将模式空间内第一行内容覆盖至保持空间中
4.(由于$!d命令)删除模式空间中内容,导致没有默认输出
5.读取第二行数据到模式空间中
6.(由于1!G命令)符合限制条件,将保持空间内第一行数据追加到模式空间内第二行之后
7.(由于h命令)将模式空间内第二行和第一行内容覆盖至保持空间中
如此反复知道最后一行,不再删除模式空间内内容,完成默认输出。
通过分析,最终的结果应为倒序输出文本,下面我们验证一下结果

[root@CentOS6 ~]#seq 10 |sed '1!G;h;$!d'10987654321

发现分析结果正确。
通过两个分析实例,我们基本掌握了sed高级编辑命令的使用方法,重点在于日后的加以练习及其运用。

原创粉丝点击