免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-04-02 16:24 |显示全部楼层 |倒序浏览
本帖最后由 levinswong 于 2010-04-02 16:55 编辑

如题。代码出自sed & awk一书的高级sed命令一章。
  1. #!/bin/sh

  2. search=$1
  3. shift
  4. for file
  5. do
  6. sed '
  7. /'"$search"'/b
  8. N
  9. h
  10. s/.*\n//
  11. /'"$search"'/b
  12. g
  13. s/ *\n/ /
  14. /'"$search"'/{
  15. g
  16. b
  17. }
  18. g
  19. D' $file
  20. done
复制代码
对了,说下作用。
查找跨行的单词,简单的举个例子:
poem.txt
  1. Stray birds of summer come to my
  2. window to sing and fly away.
  3. Come to my window,baby!
复制代码
假如我要搜索my window 短语,使用grep只能显示Come to my window,baby!这行
如果使用这个脚本,便可以把Stray birds of summer come to my
window to sing and fly away.也显示出来。

论坛徽章:
0
2 [报告]
发表于 2010-04-02 16:37 |显示全部楼层
回复 3# iori809


    说的没错啊,要坚持学习,不断学习才行啊
遇到难点去攻克它才能有明显的进步呀

论坛徽章:
0
3 [报告]
发表于 2010-04-02 16:40 |显示全部楼层
回复 4# Shell_HAT


    如果说能看懂这个段代码只算略懂的话,新手恐怕会望而却步的,呵呵

论坛徽章:
0
4 [报告]
发表于 2010-04-02 18:27 |显示全部楼层
回复 9# samlumengjun


    哦, 是这样的,假如这个脚本的名字叫okgrep,使用方法是 ./okgrep   "my window"     file1 file2 file3 ...

论坛徽章:
0
5 [报告]
发表于 2010-04-03 12:58 |显示全部楼层
当没有匹配的单词时,好像会默认输出最后一行的内容
kangle000 发表于 2010-04-03 09:54


这位兄弟果然细心,看来这是原作者未发现的一个bug或者是不屑一顾吧,不管了,修正如下:
  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
  21.   21. done
复制代码
修正后的代码可解决此bug。   
只是把N变成$!N而已。

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



    相当于for file in $*

论坛徽章:
0
7 [报告]
发表于 2010-04-03 13:47 |显示全部楼层
回复 22# vitas333_cu


    鄙视与否是你个人问题。。。

论坛徽章:
0
8 [报告]
发表于 2010-04-03 14:14 |显示全部楼层
回复  vitas333_cu


顶楼最开始发帖的时候就注明代码的出处了,自己去看看就知道了,别乱鄙视人家。
Shell_HAT 发表于 2010-04-03 14:05



    大侠说的对,其实就算我在这里通篇解释一遍,如果没有相关基础也是没有用的。建议从基础扎扎实实学起,看懂这个不难,能根据应用熟练使用那些高级命令就不容易了。

论坛徽章:
0
9 [报告]
发表于 2010-04-03 15:28 |显示全部楼层
回复 27# vitas333_cu


    不错,是一种方法。
不过效率会很低。
还有,一句话不一定都是以.结束的,而且如果正好文本的一行是以.或!或?等结束的话,还要将换行符替换成空格,然后再替换回换行符。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP