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

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

文章分类

全部博文(272)

文章存档

2015年(2)

2014年(5)

2013年(25)

2012年(58)

2011年(182)

分类: LINUX

2012-04-18 14:41:43

cat file
**********************************************************
Host:bronzewing1
Operating System:WinXP
Machine Type:Windows
Host Type:Client
Version:6.5.5
**********************************************************
Host:bronzewing2
Operating System:WinXP
Machine Type:Windows
Host Type:Client
Version:6.5.5
**********************************************************



要求把段落内的内容合并成一行:
Host:bronzewing1 Operating System:WinXP Machine Type:Windows Host Type:Client Version:6.5.5
Host:bronzewing2 Operating System:WinXP Machine Type:Windows Host Type:Client Version:6.5.5





  1. sed -n '/*/!{h;:1 n;/*/!{H;$!b1};z;x;s/\n/ /g;p}' file
[解析]
遇到星号的行不操作,然后把内容拷贝进 hold space 里,一直利用标签反复跳转,把内容 H 追加进 hold space 里,直到又再次遇见星号的行,然后 z 清空内容(把星号的行抹去),x 交换出 hold space 里的内容(就是先前追加的),替换成一行并打印。






  1. sed -n '/*/{g;s/\n/ /gp;n;h;b};H' file
[解析]
这是本文的重点,上个命令还是能出色的完成任务,但是要匹配两次星号,代码冗长了。换个思路,这个命令的思路是:遇到星号的行 g 把 hold space 里的内容替换到当前 pattern space 里的内容(就相当于抹除了星号的行),然后替换换行为空格,并打印,n 执行到下一行,然后用下一行的内容替换掉 hold space 里的前面的内容,如果不是星号的行就继续 H 追加。代码缩短了很多。



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

zooyo2014-04-24 00:33:16

expert1:膜拜之,sed用的真牛啊

你妹,你现在才发现?

回复 | 举报

expert12014-04-23 17:18:55

膜拜之,sed用的真牛啊