sed基本概念(3)

[root@VM_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

### 读取第二行的下一行,然后输出模式空间中的内容,此时模式空间中有两行

[root@VM_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就相当于把两个杯子中的东西进行了交换。

下面通过几个示例演示一下

[root@VM_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命令追加的时候是添加换行符,由于保持空间默认是空的,所以添加换行符之后就多了一个空行。以用下面的命令先往保持空间覆盖一行然后追加。

[root@VM_161_150_centos ~]# seq 1 6| sed -n '1h;2H;4p;5{x;p}'
4
1
2

第一个循环结束之后:模式空间为空,保持空间为第一行内容
第二个循环,将第二行追加到模式空间,此时模式空间为两行内容
第三个循环,没有匹配内容,不执行操作,模式空间和保持空间内容不变
第四个循环,读取第四行并输出,保持空间内容不变
第五个循环,读入第五行,然后和保持空间中的内容交换,之后输出。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/12806.html