Chinaunix首页 | 论坛 | 博客
  • 博客访问: 56815
  • 博文数量: 28
  • 博客积分: 84
  • 博客等级: 民兵
  • 技术积分: 162
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-09 17:47
个人简介

try vuuv.github.io or somewhere else.

文章分类

全部博文(28)

文章存档

2013年(1)

2012年(5)

2011年(22)

我的朋友

分类:

2011-10-07 14:55:08

原文地址:sed之H与h的妙用 作者:zooyo

文本:
1
2
foo
3
4
5
foo
6
7
8

要得到最后一个foo以后的内容:
foo
6
7
8


  1. sed -n 'H;/foo/{h};${x;p} file
[解析]
H把每行的内容都追加进hold space,当匹配到foo时,h是拷贝进缓冲区,那等于说是把之前追加的内容都清空了,用foo覆盖之前的所有内容,那匹配到最后一个foo的时候肯定就覆盖了之前的所有追加的内容了,直到文件最后,x交换出hold space里的内容,然后打印。


  1. awk 'BEGIN{while(getline <"file"){j++;if(/foo/)i=j}}NR>=i' file
[解析]
awk是在BEGIN中先找出最后一个foo的行,然后打印这个行以后的内容。


如果要是只打印foo之后的行(不包含foo)呢?awk很好改,NR>i就行了,sed呢?想想,加个n,匹配到foo时就转向下一样操作。
  1. sed -n 'H;/foo/{n;h};${x;p}' file

  2. awk 'BEGIN{while(getline <"file"){j++;if(/foo/)i=j}}NR>i' file

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