原文链接:
%3D1%26filter%3Ddigest%26digest%3D1%26digest%3D1
- b label ,无条件跳转到标签label,如果label没有指定,跳转到命令的结尾
- t label ,如果最后一次输入的最后一个 s/// 子命令执行成功,跳转到标签label,如果label没有指定,跳转到命令的结尾
- 例1: 用标签完成 是AA就加上YES,不是AA就加NO
- http://bbs.chinaunix.net/viewthread.php?tid=1632469
- 使用t命令:
- ly5066113@ubuntu:~$ cat urfile
- AA
- BC
- AA
- CB
- CC
- AA
- ly5066113@ubuntu:~$ sed '/^AA/s/$/ YES/;t;s/$/ NO/' urfile
- AA YES
- BC NO
- AA YES
- CB NO
- CC NO
- AA YES
- 复制代码
- 如果是AA,执行s/$/ YES/,s命令执行成功,执行t命令,没有标签,跳转到命令的结尾,这样将会跳过后面的s/$/ NO/
- 如果不是AA,s/$/ YES/不执行,则t命令也不执行,只执行后面的s/$/ NO/
- 使用b命令:
- ly5066113@ubuntu:~$ sed '/^AA/ba;s/$/ NO/;b;:a;s/$/ YES/' urfile
- AA YES
- BC NO
- AA YES
- CB NO
- CC NO
- AA YES
- 复制代码
- 如果是AA,执行ba,跳转到标签a处,这样会跳过中间的s/$/ NO/;b,只执行后面的s/$/ YES/
- 如果不是AA,ba不执行,执行s/$/ NO/,执行b,没有标签,跳转到命令的结尾,这样将会跳过后面的s/$/ YES/
- 例2: 合并行:
- http://bbs.chinaunix.net/viewthread.php?tid=1381004
- ly5066113@ubuntu:~$ cat urfile
- 114.113.144.2:
- 19ms
- 19ms
- 19ms
- 36ms
- 22ms
- 19ms
- 18ms
- 218.61.204.73:
- 0ms
- 0ms
- 0ms
- 0ms
- 0ms
- 0ms
- 0ms
- ly5066113@ubuntu:~$ sed ':a;$!N;/ms$/s/\n/ /;ta;P;D' urfile
- 114.113.144.2: 19ms 19ms 19ms 36ms 22ms 19ms 18ms
- 218.61.204.73: 0ms 0ms 0ms 0ms 0ms 0ms 0ms
- 复制代码
- 实现思路:
- 1、读入下一行数据
- 2、判断是否以ms结尾
- 3、如果是,替换\n为空格,跳转到1
- 4、如果不是,打印本行数据,删除本行数据,跳转到1
-
- 代码实现:
- :a #定义标签a
- $!N #不是最后一行,执行N命令
- /ms$/s/\n/ / #如果以ms结尾,将\n替换为空格
- ta #如果s///命令执行成功,跳转到标签a处
- P #打印pattern space的第一行
- D #删除pattern space的第一行,循环
-
- 此代码是使用sed进行合并行操作的典型代码,对于不同的情况,只需要将/ms$/替换成需要的正则表达式即可,思路上是通用的。
- sed的标签类似于C语言中的goto,cjaizss兄说过,写代码的时候要有状态机的思想,代码只不过是一种实现。
- 下面是他用sed写的加法,里面应用了大量的标签,有兴趣可以研究下:
- http://bbs.chinaunix.net/viewthread.php?tid=1063437
阅读(2596) | 评论(0) | 转发(0) |