Chinaunix首页 | 论坛 | 博客
  • 博客访问: 29304
  • 博文数量: 6
  • 博客积分: 1498
  • 博客等级: 上尉
  • 技术积分: 65
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-12 16:52
文章分类
文章存档

2012年(4)

2008年(2)

我的朋友

分类:

2012-04-10 14:27:34

原文地址:sed之按标签合并行 作者:zooyo

cat file
web01[10.10.1.1]
httpd ok
tomcat ok
sendmail ok
web02[10.10.1.2]
httpd ok
postfix ok
web03[10.10.1.3]
mysqld ok
httpd ok

要得到这样的格式:
web01[10.10.1.1] httpd ok
web01[10.10.1.1] tomcat ok
web01[10.10.1.1] sendmail ok
web01[10.10.1.1] web02[10.10.1.2]
web01[10.10.1.1] httpd ok
web01[10.10.1.1] postfix ok
web01[10.10.1.1] web03[10.10.1.3]
web01[10.10.1.1] mysqld ok
web01[10.10.1.1] httpd ok 





  1. sed '/web/{h;d};G;s/\(.*\)\n\(.*\)/\2: \1/' file
[解析]
这是最常规的思路,匹配到 web 关键字的行拷贝到 pattern space 里,然后在非关键字的行,G 追加在后面,然后再用替换成相应的格式。





  1. sed ':1;h;$!N;/]$/D;s/\n/ /p;g;b1' file

[解析]
这是今天看到的一个新思路,步骤其实要比上个命令烦琐一点,但是代码要简洁很多,该命令的关键是 N 读取下一行,如果不匹配 ] 符号结尾,就替换成一行,然后打印,关键是这里 g 又再次覆盖 pattern space ,然后 b 跳转去行首,继续读取下一行。如果读去到了标签行,就 D 删除上一个标签,并跳转行首,h 覆盖掉以前的标签,继续执行下面的读去操作,又替换,一直末行 $!N 不会再读去下一行,然后进行替换打印,继续操作 g;b1 跳去命令行首,一直到 D 结束整个命令。思路非常不错。



再延伸一下, 如果标签在下方呢:
httpd ok
tomcat ok
sendmail ok
web01[10.10.1.1]
httpd ok
postfix ok
web02[10.10.1.2]
mysqld ok
httpd ok
web03[10.10.1.3]


得到:
web01[10.10.1.1] httpd ok
web01[10.10.1.1] tomcat ok
web01[10.10.1.1] sendmail ok
web02[10.10.1.2] httpd ok
web02[10.10.1.2] postfix ok
web03[10.10.1.3] mysqld ok
web03[10.10.1.3] httpd ok

  1. sed -n ':a;/]/!{N;ba};s/.*\n\(.*\)/\1 &/;/\n/P;D' file


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