[sed] 分支&测试
2015-09-09 19:57
218 查看
流程控制
一般情况下,sed是将编辑命令从上到下依次应用到读入的行上,但是像d/n/D/N命令都能够在一定程度上改变默认的执行流程,甚至利用N/D/P三个命令可以形成一个强大的循环处理流程。除此之外,其实sed还提供了分支命令(b)和测试(test)两个命令来控制流程,这两个命令可以跳转到指定的标签(label)位置继续执行命令。标签是以冒号开头的标记,如下例中的:top标签:
当执行到
如果没有指定标签,则将控制转移到脚本的结尾处。也许这只是一个默认的行为,但是有时候如果用得好也是非常有用的,例如:
当执行到
下一个例子中,我们利用分支命令的跳转效果达到类似if语句的效果:
当执行到
进一步地,利用两个分支命令可以达到if..else的分支效果:
这个例子中,当执行到
上面的例子都是用到了分支命令,分支命令的跳转是无条件的。而与之相对的是测试命令,测试命令的跳转是有条件的,当且仅当当前行发生成功的替换时才跳转。
为了说明测试命令的用法,我们用它来实现前文定义过的join_lines函数:
在最前面我们添加了一个标签:a,然后在再最后面利用测试命令跳转到该标签。可能,你会觉得这里也可以用分支命令,但是事实上分支命令会导致死循环,因为在它里他没有结束的条件。
但是测试命令就不同了,这一点直到最后才体现出来。当最后一行被N命令读入之后,回车替换成逗号,此时ta继续跳转到最开头,因为所有行都已经被读入,所以$!不匹配,同时模式空间中的回车已经全部被替换成逗号,所以替换也不会发生。之前我们说过,当且仅当当前行发生成功的替换时测试命令才跳转。所以此时跳转不会发生,退出sed命令。
我们可以利用sedsed这个工具来验证上面的过程,sedsed可以用来调试sed脚本。
看第27行替换命令发生的时候,此时模式空间的内容为
而如果在这里把测试命令换成分支命令,整个执行过程就会陷入死循环了:
一般情况下,sed是将编辑命令从上到下依次应用到读入的行上,但是像d/n/D/N命令都能够在一定程度上改变默认的执行流程,甚至利用N/D/P三个命令可以形成一个强大的循环处理流程。除此之外,其实sed还提供了分支命令(b)和测试(test)两个命令来控制流程,这两个命令可以跳转到指定的标签(label)位置继续执行命令。标签是以冒号开头的标记,如下例中的:top标签:
/pattern/b top时,如果匹配pattern,则跳转到:top标签所在的位置,继续执行下一个命令command1。
如果没有指定标签,则将控制转移到脚本的结尾处。也许这只是一个默认的行为,但是有时候如果用得好也是非常有用的,例如:
/pattern/b时,如果匹配pattern,则跳转到最后。这种情况下匹配pattern的行可以避开执行后续的命令,被排除在外。
下一个例子中,我们利用分支命令的跳转效果达到类似if语句的效果:
/pattern/b end时,如果匹配pattern,则跳转到:end标签所在的位置,跳过command2而不执行。
进一步地,利用两个分支命令可以达到if..else的分支效果:
/pattern/b dothree时,若匹配pattern则中转到:dothree标签,此时执行command3;若不匹配,则执行command2,并且跳转到最后。
上面的例子都是用到了分支命令,分支命令的跳转是无条件的。而与之相对的是测试命令,测试命令的跳转是有条件的,当且仅当当前行发生成功的替换时才跳转。
为了说明测试命令的用法,我们用它来实现前文定义过的join_lines函数:
但是测试命令就不同了,这一点直到最后才体现出来。当最后一行被N命令读入之后,回车替换成逗号,此时ta继续跳转到最开头,因为所有行都已经被读入,所以$!不匹配,同时模式空间中的回车已经全部被替换成逗号,所以替换也不会发生。之前我们说过,当且仅当当前行发生成功的替换时测试命令才跳转。所以此时跳转不会发生,退出sed命令。
我们可以利用sedsed这个工具来验证上面的过程,sedsed可以用来调试sed脚本。
PATT:1,11,2,11,22,111,222,1111$,因此替换失败,ta命令不会发生跳转,脚本执行退出。
而如果在这里把测试命令换成分支命令,整个执行过程就会陷入死循环了:
相关文章推荐
- lesson1 - Navigation in Linux
- 神奇的点9工具与.9图片效果
- 引导页
- 时间问题
- huffman coding
- NYOJ 7 街区最短路径问题
- 研究生入学初期感悟
- BZOJ 1028: [JSOI2007]麻将 暴力
- 0909关于编译原理
- 如何去设计一个自适应的网页设计或HTMl5
- php-fpm的配置
- Windows 10 关键错误,“开始”菜单和 Cortana 无法工作。你下次登录时,我们将尝试解决此问题的解决方法
- POJ 2195 Going Home
- C++用法及学习心得
- Web移动端使用localStorage缓存Js和css文件
- 用busybox搭建最简单的Linux文件系统
- MySQL两种方法创建自增列
- AsyncTask的个人使用总结
- Android0908<十三>(部分Service、 ContentProvider、 BroadcastReceiver)
- ios-音乐播放器-(3)后台播放