文本处理之sed命令高级用法

文本处理之sed命令高级用法

多行模式处理空间

多行模式处理空间是 sed 中一种特殊的操作模式,用于处理包含多行文本块的输入。在默认情况下,sed 将每行视为一个独立的处理单元,但多行模式处理空间允许你在操作时考虑多行文本块。多行模式处理空间使用 N 命令将下一行添加到模式空间中,形成一个多行文本块。然后,你可以使用正则表达式或其他 sed 命令来操作这个多行文本块。在处理完整个文本块后,sed 会自动读取下一行并开始处理新的文本块。

具体来说,多行模式处理空间的基本流程如下:

  1. sed 读取一行文本到模式空间中。
  2. 使用 N 命令将下一行追加到模式空间中,形成一个多行文本块。
  3. 对多行文本块进行操作,例如匹配、替换、删除等操作。
  4. 当完成对整个文本块的操作后,sed 自动读取下一行,并开始处理新的文本块。通过使用多行模式处理空间,你可以处理需要跨越多行的操作,例如处理具有特定起始和结束标记的文本块。
1. 追加下一行:N

多行Next(N) 命令通过读取新的输入行,并将它添加到模式空间的现有内容之后来创建多行模式空间。

模式空间最初的内容和新的输入行之间用换行符分隔。在模式空间中嵌入的换行符可以利用转义序列“\n”来匹配。在多行模式空间中,元字符“~”匹配空间中的第一个字条,而不匹配换行符后面的字符。同样,“S”只匹配模式空间中最后的换行符,而不匹配任何嵌入的换行符。在执行 next 命令之后,控制将被传递给脚本中的后续命令。

Next 命令与 next 命令不同,next 输出模式空间的内容,然后读取新的输入行。next 命令不创建多行模式空间。

例如:

[root@kiwi222 ~]# cat kiwi2323 
kiwi111 123456 abc
kiwi222 qwe666
kiwi333

将kiwi222替换成222

[root@kiwi222 ~]# sed '/kiwi111/{N;s/abc\nkiwi222/222/}' kiwi2323
kiwi111 123456 222 qwe666
kiwi333
[root@kiwi222 ~]# 

如果是n的话则只能指定一行

[root@kiwi222 ~]# sed '{n;s/abc\nkiwi222/222/}' kiwi2323 
kiwi111 123456 abc
kiwi222 qwe666
kiwi333
[root@kiwi222 ~]# 

[root@kiwi222 ~]# sed '{n;s/kiwi222/222/}' kiwi2323 
kiwi111 123456 abc
222 qwe666
kiwi333
[root@kiwi222 ~]# 
2. 多行删除:D

删除命令 (d)删除模式空间的内容并导致读入新的输入行,从而在脚本的顶端重新使用编辑方法。删除命令 (D) 稍微有些不同: 它删除模式空间中直到第一个嵌入的换行符的这部分内容。它不会导致读入新的输入行,相反,它返回到脚本的顶端,将这些指令应用于模式空间剩余的内容。

例如:

[root@kiwi222 ~]# cat kiwi222 
kiwi123456

abc123


kiwi111:kiwi222



111:222




444
[root@kiwi222 ~]# 

## 这个kiwi222文件第一个空行伟为一行,第二个空行为两行,第三个空行为三行,第四个空行为四行

如果用d命令的话

[root@kiwi222 ~]# sed '/^$/{N;/^\n$/d}' kiwi222
kiwi123456

abc123
kiwi111:kiwi222

111:222
444
[root@kiwi222 ~]# 

偶数空行会被删除,奇数空行会删除到仅剩下一行。

这是因为删除命令清除的是整个模式空间。一旦遇到第一个空行就读入下一行,并且两行都被删除。如果遇到第三个空行,并且下一行不为空,那么删除命令就不会被执行,因此空行被输出。

那如果用D命令的话

[root@kiwi222 ~]# sed '/^$/{N;/^\n$/D}' kiwi222
kiwi123456

abc123

kiwi111:kiwi222

111:222

444
[root@kiwi222 ~]# 

D命令会删除空行直到仅剩下一行

多行 Delete 命令完成工作的原因是,当遇到两个空行时,Delete 命令只删除两个空行中的第一个。下一次遍历该脚本时,这个空行将导致另一行被读入模式空间。如果那行不为空,那么两行都输出,因此确保了输出一个空行。换句话说,当模式空间中有两个空行时、只有第一个空行被删除。当一个空行后面跟有文本时,模式空间可以正常输出。

3. 多行打印:P

多行打印 (Print)命令与小写字母的 print 命令稍有不同。该命令输出多行模式空间的第一部分,直到第一个嵌入的换行符为止。在执行完脚本的最后一个命令之后,模式空间的内容自动输出 (-n 选项或#n 抑制这个默认的动作)。

例如:

[root@kiwi222 ~]# cat kiwi2323 
kiwi111 123456 abc
kiwi222 qwe666
1234
kiwi666
[root@kiwi222 ~]# 
[root@kiwi222 ~]# sed -e '/6$/{N;/\n1234/{s// kiwi &/ ;P;D}}' kiwi2323 
kiwi111 123456 abc
kiwi222 qwe666 kiwi 
1234
kiwi666
[root@kiwi222 ~]#


## 注:在sed中,&意思是用正则表达式的内容替换掉读入的内容。另外,//之间不加任何内容,表示的是上一次的匹配。

这里的意思是,匹配所有以6结尾的行,并且如果下一行是1234,则在以6结尾的后面加上kiwi。输入/输出循环可以让我们匹配在结束处的以6结尾的字符,如果正常输出两行的模式空间,那么它就会丢失。

4. 保持空间

模式空间是容纳当前输入行的缓冲区。还有一个称为保持空间 (hold space)的顶留 (set-aside) 缓冲区。模式空间的内容可以复制到保持空间,而且保持空间的内容也可以复制到模式空间。

保持空间用于临时存储。单独的命令不能寻址保持空间或者更改它的内容。

保持空间的命令

命令缩写功能
Holdh或H将模式空间的内容复制或追加到保持空间
Getg或G将保持空间的内容复制或追加到模式空间
Exchangex交换保持空间和模式空间的内容

这些命令中的每一条都可以利用一个地址来指定一行或行范围。Hole(h,H)命令将数据移至保持空间、而 get (g.G) 命令将保持空间的数据移回到模式空间。

Hold 命令用模式空间的内容取代保持空间的内容。get 命令用保持空间的内容
取代模式空间的内容。

Hole 命令在保持空间的内容之后放置一个换行符,且后面跟随模式空间的内容(即使保持空间是空的,换行符也被追加到保持空间中) 。Get 命令模式空间
的内容之后放置一个换行符,且后面跟随保持空间的内容。

例如:

[root@kiwi222 ~]# cat kiwi2323 
kiwi111 123456 abc
kiwi222 qwe666
1234
kiwi666
[root@kiwi222 ~]# 

将上面这个文件里的1234与kiwi666交换位置

[root@kiwi222 ~]# sed '/1234$/{h;d};/kiwi666/{G}' kiwi2323 
kiwi111 123456 abc
kiwi222 qwe666
kiwi666
1234
[root@kiwi222 ~]# 

这里的意思是先匹配4结尾的任何行都被复制到保持空间并且从模式空间删除,最后将匹配的kiwi666读入到模式空间,并且将保持空间的行追加到模式空间的结尾。

将h换成大写G,G换成小写g

[root@kiwi222 ~]# sed '/1234$/{H;d};/kiwi666/{g}' kiwi2323 
kiwi111 123456 abc
kiwi222 qwe666

1234

这里的意思是先匹配4结尾的任何行都被追加到保持空间,然后清除模式空间的匹配4结尾的任何行,最后将kiwi666读入到模式空间,并且将保持空间的行复制覆盖模式空间。(也就是说kiwi666会被1234覆盖)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值