sed进阶之保留空间和排除命令

19 篇文章 0 订阅

shell脚本编程系列


保留空间

模式空间(pattern space)是一块活跃的缓冲区,在sed编辑器执行命令时保存着待检查的文本,但它并不是sed编辑器保存文本的唯一空间。sed编辑器还有另一块称作保留空间(hold space)的缓冲区。当你在处理模式空间中的某些行时,可以用保留空间临时保存部分行。与保留空间相关的命令有:

  • h 将模式空间复制到保留空间
  • H 将模式空间附加到保留空间
  • g 将保留空间复制到模式空间
  • G 将保留空间附加到模式空间
  • x 交换模式空间和保留空间的内容
[root@192 Chapter21-Scripts]# sed -n '/First/{
> h;p;
> n;p;
> g;p}
> ' data2.txt
First Data Line
Second Data Line
First Data Line
  • sed命令使用正则表达式作为地址,过滤出含有单词First的行
  • 当满足前面条件的行出现时,{}中的第一个命令h会将该行复制到保留空间,此时模式空间的内容和保留空间的内容是一样的
  • p命令打印模式空间的内容,也就是第一行
  • n命令会提取数据流的下一行,将其放入模式空间,现在模式空间的内容为原文本中第二行对应的内容,而保留空间的内容为原文本中第一行对应的内容
  • p命令打印模式空间的内容,为第二行
  • g命令会将保留空间的内容复制到模式空间,替代模式空间的内容,此时模式空间和保留空间的内容又一致了。
  • p命令再次打印模式空间的内容

在这里插入图片描述

排除命令

sed编辑器可以将命令应用于数据流中的每一行或是由单个地址或地址区间指定的多行。还可以指定命令不应用于数据流中的特定地址或地址空间。感叹号(!)命令用于排除(negate)命令,也就是让原本会起作用的命令失效。

sed -n '/Header/!p' data2.txt

正常情况p命令只会打印匹配规则的行,加了感叹号之后,情况反过来了,除了包含单词Header的那一行,文件中的其他行都被打印出来了。
在这里插入图片描述
对于sed命令在多行模式中没法匹配最后一行的情况,使用排除命令也可以解决。

sed '$!N;s/System\nAdmin/DevOps\nEngineer/;s/System Admin/DevOps Engineer/' data4.txt

在这里插入图片描述
利用排除命令、模式空间和保留空间可以轻松实现文本行反转的功能

#!/bin/bash
# Shell wrapper for sed editor script
# to reverse test file lines.
#
sed -n '{1!G; h; $p}' $1
#
exit

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

lang20150928

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

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

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

打赏作者

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

抵扣说明:

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

余额充值