Chinaunix首页 | 论坛 | 博客
  • 博客访问: 208304
  • 博文数量: 35
  • 博客积分: 2691
  • 博客等级: 少校
  • 技术积分: 527
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-11 09:42
文章分类

全部博文(35)

文章存档

2012年(5)

2010年(6)

2009年(2)

2008年(22)

我的朋友

分类: Python/Ruby

2012-07-03 14:17:53

原文链接:
%3D1%26filter%3Ddigest%26digest%3D1%26digest%3D1

点击(此处)折叠或打开

  1. b label ,无条件跳转到标签label,如果label没有指定,跳转到命令的结尾
  2.         t label ,如果最后一次输入的最后一个 s/// 子命令执行成功,跳转到标签label,如果label没有指定,跳转到命令的结尾

  3.         例1: 用标签完成 是AA就加上YES,不是AA就加NO
  4.         http://bbs.chinaunix.net/viewthread.php?tid=1632469

  5.         使用t命令:

  6.     ly5066113@ubuntu:~$ cat urfile
  7.     AA
  8.     BC
  9.     AA
  10.     CB
  11.     CC
  12.     AA
  13.     ly5066113@ubuntu:~$ sed '/^AA/s/$/ YES/;t;s/$/ NO/' urfile
  14.     AA YES
  15.     BC NO
  16.     AA YES
  17.     CB NO
  18.     CC NO
  19.     AA YES

  20. 复制代码
  21. 如果是AA,执行s/$/ YES/,s命令执行成功,执行t命令,没有标签,跳转到命令的结尾,这样将会跳过后面的s/$/ NO/
  22.         如果不是AA,s/$/ YES/不执行,则t命令也不执行,只执行后面的s/$/ NO/

  23.         使用b命令:

  24.     ly5066113@ubuntu:~$ sed '/^AA/ba;s/$/ NO/;b;:a;s/$/ YES/' urfile
  25.     AA YES
  26.     BC NO
  27.     AA YES
  28.     CB NO
  29.     CC NO
  30.     AA YES

  31. 复制代码
  32. 如果是AA,执行ba,跳转到标签a处,这样会跳过中间的s/$/ NO/;b,只执行后面的s/$/ YES/
  33.         如果不是AA,ba不执行,执行s/$/ NO/,执行b,没有标签,跳转到命令的结尾,这样将会跳过后面的s/$/ YES/


  34.         例2: 合并行:
  35.         http://bbs.chinaunix.net/viewthread.php?tid=1381004

  36.     ly5066113@ubuntu:~$ cat urfile
  37.     114.113.144.2:
  38.     19ms
  39.     19ms
  40.     19ms
  41.     36ms
  42.     22ms
  43.     19ms
  44.     18ms
  45.     218.61.204.73:
  46.     0ms
  47.     0ms
  48.     0ms
  49.     0ms
  50.     0ms
  51.     0ms
  52.     0ms
  53.     ly5066113@ubuntu:~$ sed ':a;$!N;/ms$/s/\n/ /;ta;P;D' urfile
  54.     114.113.144.2: 19ms 19ms 19ms 36ms 22ms 19ms 18ms
  55.     218.61.204.73: 0ms 0ms 0ms 0ms 0ms 0ms 0ms

  56. 复制代码
  57. 实现思路:
  58.         1、读入下一行数据
  59.         2、判断是否以ms结尾
  60.         3、如果是,替换\n为空格,跳转到1
  61.         4、如果不是,打印本行数据,删除本行数据,跳转到1
  62.        
  63.         代码实现:
  64.         :a #定义标签a
  65.         $!N #不是最后一行,执行N命令
  66.         /ms$/s/\n/ / #如果以ms结尾,将\n替换为空格
  67.         ta #如果s///命令执行成功,跳转到标签a处
  68.         P #打印pattern space的第一行
  69.         D #删除pattern space的第一行,循环
  70.        
  71.         此代码是使用sed进行合并行操作的典型代码,对于不同的情况,只需要将/ms$/替换成需要的正则表达式即可,思路上是通用的。


  72.         sed的标签类似于C语言中的goto,cjaizss兄说过,写代码的时候要有状态机的思想,代码只不过是一种实现。
  73.         下面是他用sed写的加法,里面应用了大量的标签,有兴趣可以研究下:
  74.         http://bbs.chinaunix.net/viewthread.php?tid=1063437

阅读(2596) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~