unix sed分支命令

分支命令

分支命令修改脚本文件中命令的正规流向。我们知道,对于文件的每一行,sed运行脚本文件来应用匹配当前模式空间文本的命令;在脚本文件的结尾,模式空间中的文本被复制到输出文件中,而下一行文本被读入模式空间中,替换了旧文本。有时我们要忽略有些命令的应用。分支命令允许我们这样做:忽略脚本文件中的一条或多条命令。分支命令共有两条:分支(b)和替代分支(t)。

1.分支标签

每个分支命令必须有一个目标,它或者是一个标签,或者是脚本中的最后一个指令(一个空标签)。标签由那些以冒号(:)开始的行组成,后跟标签名(它最多由7个字符组成)。在脚本标签行,除了冒号和标签,可能再没有其他的命令或文本。标签名必须紧跟在冒号之后,在冒号和名字之间可以没有空格,名字中间不能嵌入空格。一个标签的例子如下:
:conHere

2.分支命令

分支命令(b)的格式类似于一般格式。由地址,命令(b)和属性(目标)组成。它可以一直分支到脚本的结尾,也可以分支到脚本的指定位置。
目标必须是空格或匹配脚本内的一个脚本标签。如果未给出标签,则分支到脚本的结尾结束(最后一行),在该位置,模式空间的当前内容被复制到输出文件中,脚本对下一输入行进行重复处理。

$sed -f branch.sed branch.dat
#script name : branch.set
/(1)/b #未给出标签,则分支到脚本的结尾结束(最后一行)
/(2)/b print2
/(3)/b print3

#branch to end of scrip
b

#print three
:print3
p
p
b

#print two
:print2
p

Input:
print me once
(2)print me twice
(3)print me three
(4)print me once

Output:
print me once
(2)print me twice
(2)print me twice
(3)print me three
(3)print me three
(3)print me three
(4)print me once

分析:因为sed在脚本结尾处自动将每一行打印一次,我们只需打印额外的行即可,因此print2打印一次,print3打印2次。
在分支脚本中一个很常见的错误是忘记分支一直到脚本结尾才会结束。在该脚本中,我们两次用到它(b):一次在分支测试后,一次在第一个标签后,如果print3后的分支被忽略,脚本会进入print2。在一个脚本标签后没有自动分支。
如果脚本需要其他命令,可以把它们放到前面,否面再加分支命令。脚本标签通常放在脚本的结尾。

3.替代命令的分支

与条件分支不同,只有在已经替代后(s///g),我们才可能需要分支,在这种情况下,我们使用替代分支,也称为测试命令(t)。其格式与基本分支命令相同。
替代命令后紧跟着分支,如果替换已经进行,则采取分支,如果替换模式未找到,则分支被忽略,在替代和分支之间也可以有其他命令,但不能是另一种替代。

$sed -f branchsub.sed branchsub.dat
#scipt name:branchsub.sed
s/(1)//
t
s/(2)//
t print2
s/(3)//
t print3

#branch to end of scrip
b

#print three
:print3
p
p
b

#print two
:print2
p

Input:
print me once
(2)print me twice
(3)print me three
(4)print me once

Output:
print me once
print me twice
print me twice
print me three
print me three
print me three
(4)print me once

4.例

:top
command1
command2
/pattern/b top
command3

当执行到/pattern/b top时,如果匹配pattern,则跳转到:top标签所在的位置,继续执行下一个命令command1。
如果没有指定标签,则将控制转移到脚本的结尾处。也许这只是一个默认的行为,但是有时候如果用得好也是非常有用的,例如:

/pattern/b
command 1
command 2
command 3

当执行到/pattern/b时,如果匹配pattern,则跳转到最后。这种情况下匹配pattern的行可以避开执行后续的命令,被排除在外。

下一个例子中,我们利用分支命令的跳转效果达到类似if语句的效果:
command1
/pattern/b end
command2
:end
command3

当执行到/pattern/b end时,如果匹配pattern,则跳转到:end标签所在的位置,跳过command2而不执行。

进一步地,利用两个分支命令可以达到if…else的分支效果:

command1
/pattern/b dothree
command2
b
:dothree
command3

这个例子中,当执行到/pattern/b dothree时,若匹配pattern则中转到:dothree标签,此时执行command3;若不匹配,则执行command2,并且跳转到最后。

上面的例子都是用到了分支命令,分支命令的跳转是无条件的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值