免费注册 查看新帖 |

Chinaunix

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

能把这段代码完全看懂,就可以说你掌握sed了 [复制链接]

论坛徽章:
0
1 [报告]
发表于 2010-04-03 13:25 |显示全部楼层
for file是干什么的?

论坛徽章:
0
2 [报告]
发表于 2010-04-03 18:06 |显示全部楼层
本帖最后由 kingoftime3 于 2010-04-04 23:39 编辑

大体过程:

  1.    1. #!/bin/sh
  2.    2.

  3.    3. search=$1
  4.    4. shift
  5.    5. for file
  6.    6. do
  7.    7. sed '
  8.    8. /'"$search"'/b     ###如果此行可以匹配,退出进入下一行,以下处理不能用一行匹配行
  9.    9. $!N
  10.   10. h
  11.   11. s/.*\n//              ###由于上面将两行合并了,现在要判断合并中的第二行是否可以单行匹配
  12.   12. /'"$search"'/b     ###若可以则退出进入下一行
  13.   13. g
  14.   14. s/ *\n/ /                ####将合并中的两行中第一行最后的空格及换行符删除
  15.   15. /'"$search"'/{        ####此处是用两行可以匹配的情形
  16.   16. g
  17.   17. b
  18.   18. }
  19.   19. g
  20.   20. D' $file            ####D是删除两行中的第一行,因为第二行有可能和第三行组合得到匹配
  21.   21. done
复制代码
也就是用到hold space来控制程序流程,大家不用被它的长度吓到:)

论坛徽章:
0
3 [报告]
发表于 2010-04-04 23:50 |显示全部楼层
本帖最后由 kingoftime3 于 2010-04-05 08:31 编辑

回复 33# vitas333_cu


    这种方法在处理大文件时效率较高,它就像走路一样

  1. 111------        #先作一次判断
  2.          |        #两行合起来判断,先判断第二行是否匹配,再判断两行合起来是否匹配
  3. 222-----------       #扔掉上一行
  4.              |
  5. 333------------------
  6.                     |
  7. 444------------------------
复制代码
单行匹配后就立即跳转,两行匹配后先恢复成原来两行的样子再跳转,若没有匹配,则删除第一行,再将第三行读入进行下一轮

由于单行匹配后它就会退出这行的匹配,所以如果一行中有关键词,而且和下一行组合又有一个关键词,这样它就找不到第二种情况

至于为什么要在两行合并后才判断第二行是否匹配,是因为当只有第二行匹配时,如果不这样,会导致被误认为两行合起来匹配成功

论坛徽章:
0
4 [报告]
发表于 2010-04-05 16:10 |显示全部楼层
本帖最后由 kingoftime3 于 2010-04-05 16:16 编辑

回复 36# vitas333_cu

可以匹配到两个,如果两行中第二行开头有空格就匹配不上(例如你写的第三个my window),修改如下

  1. s/ *\n */ /   #原文是s/ *\n/ /
复制代码
当然,如果将空格用\s表示我感觉更好些

  1. s/\s*\n\s*/ /
复制代码

论坛徽章:
0
5 [报告]
发表于 2010-04-05 16:49 |显示全部楼层
本帖最后由 kingoftime3 于 2010-04-05 17:05 编辑

回复 40# vitas333_cu

  1. sed -n -e '/my window/p' -e 'N;/my\s*\n\s*window/p;D' file.txt
复制代码
至于怎么将参数加进去就不用写了吧~

效率很低,一般情况不要把时间浪费在读取文件上,上面就读了两次

上面是我的推测,在实验后得出结果是:
---------------------------
100000行的文件
上面的程序用时
real       0m0.117s
user      0m0.108s
楼主所示的程序用时
real       0m0.463s
user      0m0.460s
---------------------------
1000行
上面的程序用时
real       0m0.003s
user      0m0.000s
楼主所示的程序用时
real       0m0.009s
user      0m0.008s

-----------------------------------------------
结论:逻辑上的简化也可以在效率上“充分”体现~~~~~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP