LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: aaccdd

使用sed如何提取特定的一串字符呢?

[复制链接]
 楼主| 发表于 2004-7-14 18:15:37 | 显示全部楼层
eval命令在这里起什么作用呢?
:ask

我知道它是二次叠代,
但是`link_addr`的二次叠代应该是什么内容呢?
发表于 2004-7-14 18:59:15 | 显示全部楼层
最初由 KornLee 发表
这样试试,
eval wget `<link_addr` -O file_addr

我实验了一下,用这个就可以完成wget,而单纯的用
wget `<link_addr` -O file_addr就会出错,错误提示跟你提供的一样![php]
/home/lee#wget `<addr` -O addrfile
--19:03:39--  ftp://%22http//202.108.34.200/in ... MTQwMjMwMjYjIyAg%22
           => `addrfile'
Resolving %22http... failed: Host not found.
/home/lee#cat addrfile
/home/lee#ll addrfile
-rw-r--r--    1 lee      lee             0  7月 14 19:03 addrfile
/home/lee#eval wget `<addr` -O addrfile1
--19:04:23--  http://202.108.34.200/interface/ ... DA3MTQwMjMwMjYjIyAg
           => `addrfile1'
Connecting to 202.108.34.200:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [application/smil]

    [ <=>                                                               ] 240          234.38K/s

19:04:24 (234.38 KB/s) - `addrfile1' saved [240]

/home/lee#ll addrfile1
-rw-r--r--    1 lee      lee           240  7月 14 19:04 addrfile1
/home/lee#cat addrfile1
<smil>
        <head>
                <meta name="copyright" content="MediaStack 3.0"/>
        </head>
        <body>
                <video src="rtsp://202.108.34.203/by2/by0409/300k/Rgqwl.rm?mid=1&sid=1898539394216611338445936339406340365187220107705036730884973373"/>
        </body>
</smil>
/home/lee#[/php]
 楼主| 发表于 2004-7-14 23:11:10 | 显示全部楼层
又改了一下,
现在这样了,
可以播放,也可以下载:

  1. #!/bin/sh
  2. # 这个脚本用来播放北京宽带网视频花园的在线电影
  3. # 方法可能很笨,但是我很有成就感 ^_^
  4. # 欢迎高手不吝赐教!aaccdd<waxyxgn@hotmail.com>
  5. echo "==================================================="
  6. echo "         你可以使用此脚本播放或下载BBN在线电影"
  7. echo "  方法:找到在线电影的介绍页面,将该页的的地址复制"
  8. echo "       粘贴到下面的输入位置,按回车即可"
  9. echo "  使用前提:"
  10. echo "       1,使用北京通信公司的adsl上网"
  11. echo "       2,系统里安装了MPlayer"
  12. echo "  通过此脚本,你可以:"
  13. echo "       1,在线播放电影"
  14. echo "         选择播放比率,选项1:128k/2:300k"
  15. echo "       2,下载影片/获得下载地址,仅限BBN用户"
  16. echo "==================================================="
  17. echo
  18. echo "  输入播放页面地址: "
  19. read page_addr
  20. echo
  21. echo "  输入播放比率:"
  22. read rate
  23. echo
  24. case $rate
  25.         in
  26.         128k) rate=128k;;
  27.         300k) rate=300k;;
  28.         750k) rate=750k;;
  29.         *)    echo "Invalid rate!";exit;;
  30. esac
  31. wget $page_addr -O temp_file1
  32. grep "play_rate" ./temp_file1|grep "$rate"|tr '"' '\n'|grep "play_rate=$rate"|cut -d "(" -f2 |sed 's/\(..$\)//'|sed 's/\(^.\)//'>temp_file2;rm temp_file1
  33. if [ $rate = 750k ]
  34. then
  35.         link_addr1="http://media.bbn.com.cn/zxyy/`cat temp_file2`";rm temp_file2
  36. else
  37.         link_addr1="http://media.bbn.com.cn`cat temp_file2`";rm temp_file2
  38. fi
  39. wget $link_addr1 -O link_addr2;unset link_addr1
  40. if [ $rate = 750k ]
  41. then
  42.         cat link_addr2|grep "ftp"|tr '"' '\n'|grep "ftp" > link_addr3;rm link_addr2
  43.         echo "Do you want to download now?"
  44.         read action
  45.         case $action
  46.         in
  47.         [Yy]) echo "Download Now!";wget "$link_addr3";rm link_addr3;;
  48.         [Nn]) echo "Download Later!";cat link_addr3;rm link_addr3;exit;;
  49.         esac
  50. else
  51.         cat link_addr2|grep "SRC" > link_addr3;rm link_addr2                                                                           
  52.         wget `cat link_addr3|tr '"' '\n'|grep ^http` -O link_addr4;rm link_addr3
  53.         cat link_addr4|tr '"' '\n'|grep ^rtsp > real_addr;rm link_addr4
  54.         mplayer -playlist real_addr;rm real_addr
  55. fi

复制代码


ps:从BBN下载的电影有DRM数字版权验证,只能用WMP9播放。
发表于 2004-7-19 22:08:57 | 显示全部楼层
sed作这种事情实在是很勉强
最好用perl/python这样支持html parser的语言来实现
 楼主| 发表于 2004-7-19 22:12:00 | 显示全部楼层
刚刚开始学脚本,
没有基础
不会perl/python,
希望以后能学会。
发表于 2004-7-19 23:18:44 | 显示全部楼层
道理很简单。
在bash对``进行命令替换后,若link_addr被""包裹,且本次命令行处理已到尾声,不再对双引号作跳步处理,在本次命令行处理的最后,bash把带有双引号的link_addr传递给wget,自然出错。%22正是双引号的url译码。
eval把第一次命令行处理所得进行第二次命令行处理,这次就把双引号去掉了,自然成功。

ps:请熟练铭记基本知识(命令行处理)。unix的工具哲学中,接口的约定是很重要的。
参阅置顶的命令行处理一帖。我当初正是考虑到这个基本性问题,才发此帖的。愿各位新手能详阅之。
还是老生常谈,稳扎基础,触类旁通,学一当十也。
http://www.linuxsir.cn/forum.php?mod=viewthread&tid=99465
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表