sed命令高级部分
一、多行模式空间
模式空间与保持空间概念
模式空间:
sed在处理文本时使用的主要空间。它是一个临时缓冲区,用于存储当前处理的文本行。默认情况下,sed逐行读取输入文件,将每一行依次存储在模式空间中,然后对其进行处理。处理完成后,模式空间中的内容将被打印输出或传递给下一个命令。
保持空间:
是另一个临时空间,用于存储额外的数据。它可以用于在处理过程中保存一些信息,以便稍后使用。保持空间的内容不会被打印输出,除非显式地使用 h 或 H 命令将其复制到模式空间中。
二、命令用法示例
命令N:将模式空间里面两行的内容转换为一行内容
[root@controller ~]# cat aa
iohn 85 92 78 94 88
andrea 88 90 75 90 86
jasper 84 88 80 92 84
[root@controller ~]#
[root@controller ~]# sed '/iohn/{N;s/88\nandrea/86 andrea/}' aa
iohn 85 92 78 94 86 andrea 88 90 75 90 86
jasper 84 88 80 92 84
[root@controller ~]#
先匹配到iohn这一行,然后使用大写N命令将andrea这一行添加到模式空间进行编辑,由于iohn这一行后面输入了一个换行符\n,我们可以将\n换成其他的符号,这样就可以将两行变成一行。
命令d:删除模式空间中的行
[root@controller ~]# cat aa
11111111
hello world
33333333
hello
44444444
55555555
[root@controller ~]#
[root@controller ~]# sed '/^$/{N;/^\n$/d}' aa
11111111
hello world
33333333
hello
44444444
55555555
[root@controller ~]#
由于匹配空行时使用了换行,使用小写D命令进行删除时,奇数行会保留一行而偶数行会全部删除。
有偶数个空行时,所有的空行都会被删除。仅当有奇数个空行时,有一行被保留下来。这是因为删除命令清除的是整个模式空间。一旦遇到第一个空行,就读入下一行,并且两行都被删除。如果遇到第三个空行,并且下一行不为空,那么删除命令就不会被执行,因此空行被输出。
命令D:删除多行模式空间中的所有行
[root@controller ~]# cat aa
11111111
hello world
33333333
hello
44444444
55555555
[root@controller ~]#
[root@controller ~]# sed '/^$/{N;/^\n$/D}' aa
11111111
hello world
33333333
hello
44444444
55555555
[root@controller ~]#
由于匹配空行时使用了换行,使用大写D命令进行删除时,始终会保留一个空行
当模式空间中有两个空行时、只有第一个空行被删除。当一个空行后面跟有文本时,模式空间可以正常输出。
命令P:打印多行模式中的第一行
[root@controller ~]# cat cc
Here are examples of the UNIX
System. Where UNIX
System appears,it should be the UNIX
0perating System.
[root@controller ~]#
[root@controller ~]# sed '/UNIX$/{N;/\nSystem/{s// 0perating &/;P}}' cc
Here are examples of the UNIX 0perating
Here are examples of the UNIX 0perating
System. Where UNIX
System appears,it should be the UNIX
0perating System.
[root@controller ~]#
先用$匹配到第一行最后一个字段UNIX,再使用换行匹配System并且使用替换命令将System这一行替换为0perating,由于使用了大写N命令将两行的内容转换为一行内容,0perating会跟在第一行后面打印出来。
命令H:将模式空间追加到保持空间
[root@controller ~]# sed '/22/H' cc
1
2
11
22
111
222
[root@controller ~]#
大写H命令表示把模式空间的内容追加到保持空间,追加之前保持空间的内容不会被覆盖; 相反,它在当前保持空间内容后面加上换行符\n,然后把模式空间内容追加进来。
使用命令h和大写G,将1和2顺序交换
命令h:将模式空间复制到保持空间
命令G:将保持空间追加到模式空间
[root@controller ~]# cat cc
1
2
11
22
111
222
[root@controller ~]#
[root@controller ~]# sed '/1/{h;d} ;/2/{G}' cc
2
1
22
11
222
111
[root@controller ~]#
先匹配1开头的数字将其复制到保持空间把模式空间清空,再匹配2开头的数字将保持空间的内容追加到模式空间,这样就实现了1和2的顺序交换。
命令x:交换模式空间和保持空间的内容
[root@controller ~]# cat aa
11111111
hello world
33333333
hello
44444444
55555555
[root@controller ~]#
[root@controller ~]# sed '/^$/! {H;d};/^$/{x}' aa
11111111
hello world
33333333
hello
44444444
55555555
[root@controller ~]#
使用 !匹配除空行以外的行,将其复制到保持空间,然后使用命令 d 将模式空间的行删除,使用命令 d 删除会保留一个空行,再使用x命令将保持空间的和模式空间的内容交换。