Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1641511
  • 博文数量: 409
  • 博客积分: 6240
  • 博客等级: 准将
  • 技术积分: 4908
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-01 00:04
文章分类

全部博文(409)

文章存档

2021年(1)

2019年(1)

2017年(1)

2016年(13)

2015年(22)

2013年(4)

2012年(240)

2011年(127)

分类:

2011-08-05 16:45:47

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重组输出。

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