sed命令高级部分

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命令将保持空间的和模式空间的内容交换。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

这linux不学也罢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值