Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2979104
  • 博文数量: 272
  • 博客积分: 5544
  • 博客等级: 大校
  • 技术积分: 5496
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-08 00:48
个人简介

  每个人都要有一个骨灰级的爱好,不为金钱,而纯粹是为了在这个领域享受追寻真理的快乐。

文章分类

全部博文(272)

文章存档

2015年(2)

2014年(5)

2013年(25)

2012年(58)

2011年(182)

分类: LINUX

2012-03-31 21:44:43

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


阅读(3008) | 评论(0) | 转发(2) |
0

上一篇:sed之y运用

下一篇:sed之自动填充空白位

给主人留下些什么吧!~~