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

全部博文(87)

文章存档

2013年(1)

2012年(86)

分类:

2012-04-14 15:38:43

原文地址: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

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