Chinaunix首页 | 论坛 | 博客
  • 博客访问: 207965
  • 博文数量: 87
  • 博客积分: 192
  • 博客等级: 入伍新兵
  • 技术积分: 455
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-14 07:44
文章分类

全部博文(87)

文章存档

2013年(1)

2012年(86)

分类:

2012-04-14 15:28:19

cat file 
123
abc
234
abc
bcd
xyz
efg
xyz
xyz
wih

要求取到第一个 abc 开头最后一个 xyz 结尾的内容:
abc
234
abc
bcd
xyz
efg
xyz
xyz




  1. sed -n '/abc/{p;:a;n;H;/xyz/{x;s/\n//p;z;h};ba}' file
[解析]
首先说明,用 /m/,/n/ 这样的地址对取内容是肯定不行的。这个语句的思路是匹配到 abc 的关键字后就一直 H 追加到 hold space 里,直到遇见 xyz 关键字(该行内容也是追加到缓冲区),然后 x 交换出先追加到缓冲区的内容,替换掉第一个换行符,打印,然后再用 z 把 pattern space 清空,h 这时候也等于是清空了 hold space 里的内容,然后跳转到标记处,继续 n 执行下一行, H 追加到 hold space 里,如果后面还有 xyz 关键字同样会继续刚才的操作,如果没有一直到末尾,就结束命令。 z 是 gun sed 的扩展,4.2.0版本后支持。

 


  1. awk '/abc/,0{i=i?i"\n"$0:$0}/xyz/{print i;i=""}' file
  2. awk '/abc/{x=1}x{i=i?i"\n"$0:$0}/xyz/{print i;i=""}' file
[解析]
/abc/,0这个是取abc开始到最后的内容,跟第二个命令用一个变量开关是一个道理,用变量 i 来保存内容,遇到 xyz 关键自就打印出来,并清空变量i。


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