免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: liqius
打印 上一主题 下一主题

sed,awk如何解决 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2011-12-22 14:53 |只看该作者
sed -r ':a;N;$!ba;s/\bfoo\b|$/\x1a&/g;s/\n[ \t]*\x1a[^\x1a]*\x1a$//;s/\x1a//g' file

我也是从网上看到的,呵呵。
第一句:a;N;$!ba;是不断读入下一行直至文件末尾,使整个文件成一行储存在pattern space
s/\bfoo\b|$/\x1a&/g,这个是给每一个foo的前面加上一个\x1a标记(同时给文章末$也加上标记),x1a是ascii16进制的那个substitue,用来标记找到的匹配,因为如果只用foo来标记的话,后面想写出除了符合条件的foo以外的字符就很困难,而用了\x1a就简化了这一操作,只要[^\x1a]就可以了。当然用\x1a只是因为这个少用,你可以使用任何在文本里面不可能出现的字符来标记。
s/\n[ \t]*\x1a[^\x1a]*\x1a$//,这个是删除从最后一个标记到文章末的标记之间的字符,因为使用了[^\x1a],所以可以保证不会因贪婪匹配而匹配多个段落
s/\x1a//g,最后删除标记

其实我这方法太麻烦了,昨晚在zooyo的空间里面学到一个更简单的方法
sed ':a;N;$!ba;s/\(.*\)\nfoo.*/\1/g'
充分利用正则的贪婪匹配的性质,同时逆向思维,将要删除最后一段理解为要保留前面的段,真的very brilliant

论坛徽章:
0
22 [报告]
发表于 2011-12-24 07:11 |只看该作者
明白了,vi里面也有这个substitue
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP