原帖链接:
%3D1%26filter%3Ddigest%26digest%3D1%26digest%3D1
文本最后面有空行:无空行该语句不行
sed -nr ':a;N;/ms$/{H;z;ba};x;s/^\n//;s/\n/ /gp;' urfile
下面语句支持文本最后无空行
sed -nr ':a;N;$bb;/ms$/{H;z;ba};x;s/^\n//;s/\n/ /gp;b;z;:b;H;x;s/^\n//;s/\n/ /gp' urfile
- 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
阅读(2501) | 评论(0) | 转发(0) |