高级命令
之前我们用到的sed命令都是一行一行的进行处理文本的,不过有些时候单行处理可能并不能满足我们的需要,所以sed还提供了多行模式,多行模式的命令主要有NPD这三个,
N:读取匹配到的行的下一行追加至模式空间
P:打印模式空间开端至\n内容,并追加到默认输出之前
D:如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本, 并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间 不包含换行符,则会像发出d命令那样启动正常的新循环
首先还是先看一下N命令的大致流程图,P和D命令在懂了N命令之后也容易理解。
需要注意的是,之所以叫多行模式是因为可以存放不止两行,如下示例:
[[email protected]_161_150_centos ~]# cat /etc/passwd |sed -n ‘2{N;p}‘
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
### 读取第二行的下一行,然后输出模式空间中的内容,此时模式空间中有两行
[[email protected]_161_150_centos ~]# cat /etc/passwd |sed -n ‘2{N;N;N;p}‘
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
### 使用多个N命令可以读取多行进模式空间
模式空间
除了模式空间,sed命令还有另外一个空间叫保持空间,其实保持空间很容易理解,之前我们说sed在处理文本的时候都是在模式空间中进行,但有时候有些复杂的操作单一的模式空间可能无法满足我们的需求于是就有了模式空间,模式空间你可以看作是模式空间的翻版,但是这个空间通常是空闲的,并不处理数据,只在有需要的时候和模式空间进行一些必要的数据交换。下面是模式空间中的常用命令。
h: 把模式空间中的内容覆盖至保持空间中
H:把模式空间中的内容追加至保持空间中
g: 从保持空间取出数据覆盖至模式空间
G:从保持空间取出内容追加至模式空间
x: 把模式空间中的内容与保持空间中的内容进行互换
打个比方,假如你有两个杯子,
h 就相当于吧二个杯子中的东西替换为第一个杯子中的,
H就相当于把第一个杯子中的东西放到第二个杯子中,并且第二个杯子中的东西还在,
g和h相似,不过是反了过来吧第一个杯子中的东西替换为第二个杯子中的,
G也是和H类似,x就相当于把两个杯子中的东西进行了交换。
下面通过几个示例演示一下
[[email protected]_161_150_centos ~]# seq 1 6| sed -n ‘1,2H;4p;5{x;p}‘
4
1
2
解释一下,-n是不显示默认输出内容,1,2H是将前两行追加至保持空间,4p显示第四行,5{x;p}是在第五行的时候交换保持空间和模式空间中的内容并且输出。注意输出中的空行,这是因为H命令追加的时候是添加换行符,由于保持空间默认是空的,所以添加换行符之后就多了一个空行。以用下面的命令先往保持空间覆盖一行然后追加。
[[email protected]_161_150_centos ~]# seq 1 6| sed -n ‘1h;2H;4p;5{x;p}‘
4
1
2
第一个循环结束之后:模式空间为空,保持空间为第一行内容
第二个循环,将第二行追加到模式空间,此时模式空间为两行内容
第三个循环,没有匹配内容,不执行操作,模式空间和保持空间内容不变
第四个循环,读取第四行并输出,保持空间内容不变
第五个循环,读入第五行,然后和保持空间中的内容交换,之后输出。
原文地址:http://blog.51cto.com/13672361/2110213