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

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

文章分类

全部博文(272)

文章存档

2015年(2)

2014年(5)

2013年(25)

2012年(58)

2011年(182)

分类: LINUX

2011-08-04 13:25:54

123
232
313
321
截取第一个2和最后一个2之间的内容(红色部分):
3
232
313
3
 
  1. sed ':a;N;$!ba;s/[^2]*2\(.*\)2.*/\1/' file

[解析]

  当初看到这个题的时候无从下手,真没有想到可以用sed来完成,Tim大师的思路真的值得人五体投地的敬佩,向前辈们致敬。这些另辟蹊径的思路真的值得大家借鉴和积累。接着来分析,首先Tim大师的思路是把所有的行全读入pattern space中,来统一处理,所以有了“:a;N!ba;”这个命令,到了最后一行不执行跳转,那现在pattern space中的内容就成了“123\n232\n313\n321”,然后执行后面的替换语句,由于充分利用正则贪婪匹配的原理,它会匹配到最后一个2的,然后用小括号标记起来,最后打印。

 

  1. awk '{x=x==""?$1:x RS $1}END{print gensub(/[^2]*2(.*)2.*/,"\\1","g",x)}' file

[解析]

  同样,在理解了这个替换原理后我们同样可以使用awk来完成它,把所有内容赋值给一个变量,然后利用gensub函数对它进行正则替换。

 

 

  1. awk -vRS=2 'NR>2{printf NR==3?s:"2"s}{s=$0}END{printf "\n"}' file

[解析]

  这才是真的awk思路,这样的语法结构可以打印除第一行和最后一行以外的内容,就是斩头去尾,用三目运算来控制好输出格式就行了。

 

  1. awk -vRS='^[^2]*2|2[^2]*$' NF file

[解析]

  先膜拜黑哥的思路,把开头到2的和末尾到2的设置为RS,直接NF重组输出。

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

expert12011-08-05 09:41:40

sed这个很常用的,特别是\1,\2提取部分内容,这个叫模式匹配还什么的,前提要熟悉regexp