conky的天气预报原来直接是论坛上某位大婶的,后来天气预报网页改版了就寻思这自己改写一下。原来从来没接触过sed,百度了几天之后试着自己写写试试。发现了一个奇怪的问题:w3m -dump http://www.weather.com.cn/weather/101220501.shtml |sed -n '150,235p'|sed '/^$/d' >${wfile}
sed -i -e '/°C/{n;s/°C/°C到/}' ${wfile}
sed -i '/°C/x' ${wfile}
sed -i '/^$/d' ${wfile}
sed -i '/[到,风]/!s/$/-/' ${wfile}
这几行在我的笔记本上(ubuntu10.04)上执行的没有问题,但在ubuntu12.04上执行发现前两个匹配°C的行结果后在10.04上的结果不一样。(后面处理的结果是一样的)。不一样之处在“sed -i '/°C/x' ${wfile}”这一句,12.04上执行这一句后第一行含有°C的行没有了,第二行含有°C的前面加的“到”字没有了。
请教一个sed的奇怪的问题?
- szl1997
- 帖子: 292
- 注册时间: 2009-11-24 14:12
- eexpress
- 帖子: 58428
- 注册时间: 2005-08-14 21:55
- 来自: 长沙
- astolia
- 论坛版主
- 帖子: 6703
- 注册时间: 2008-09-18 13:11
Re: 请教一个sed的奇怪的问题?
你没有弄明白sed的x命令的意思。
解析html,还是要用专门的工具,而不是用sed之类的纯文本处理工具
sed -i '/°C/x' ${wfile} 这样做的实际效果是把原来第N次出现°C的行与第N-1次的行交换,而非你想要的把某一天的两行数据交换。所以第一次的行会被清空,前一天的数据会跑到后一天去。x Exchange the contents of the hold and pattern spaces.
解析html,还是要用专门的工具,而不是用sed之类的纯文本处理工具
- szl1997
- 帖子: 292
- 注册时间: 2009-11-24 14:12
Re: 请教一个sed的奇怪的问题?
解释一下,因为笔记本和台式机不在一起,所以截图的时间不是同一天,上图是12.04上执行的结果,下图是10.04上执行的结果。代码是完全一样的,可以发现不同的地方在上图中第一行温度没有了,第二行中“到“字没有了。(终端输出,不是原文件,但源文件也是一样的)。10.04上执行x的时候第一个匹配的行因为没有连续两行含有°C所以产生了一个空行,后面有连续两行有°C的话两行直接互换。(我也很奇怪为什么仅仅sed ‘/°C/x‘可以做到,想了半天都不行想直接x一下行不行没想到成功了)。
如果想将匹配行和下一行互换正确该怎么写?

男儿心比铁,纵死亦千钧!
- astolia
- 论坛版主
- 帖子: 6703
- 注册时间: 2008-09-18 13:11
- astolia
- 论坛版主
- 帖子: 6703
- 注册时间: 2008-09-18 13:11
Re: 请教一个sed的奇怪的问题?
我自己来做的话,如果不用高级语言,就用专门的html解析工具,代码的灵活性可读性要好得多
xidel容错度高比较适合干这种事 http://videlibri.sourceforge.net/xidel.html 。支持用xpath或css选择器来确定文本位置,不必去管具体行数了
xidel容错度高比较适合干这种事 http://videlibri.sourceforge.net/xidel.html 。支持用xpath或css选择器来确定文本位置,不必去管具体行数了
代码: 全选
#!/bin/sh -
DATA=`wget 'http://www.weather.com.cn/weather/101220501.shtml' -O - 2>/dev/null | xidel --html --css "#7d" - 2>/dev/null`
export DATA
pick() {
echo "$DATA" | xidel --css "#7d>ul>li[data-dn=7d$1]>$2" - 2>/dev/null
}
for i in `seq 7`; do
DAY=`pick ${i} "h2"`
WEA=`pick ${i} "p.wea"`
THI=`pick ${i} "p.tem1>span"`
TLO=`pick ${i} "p.tem2>span"`
WIN=`pick ${i} "p.win>i"`
echo "$DAY $WEA $TLO~$THI°C $WIN"
done
18日 晴转阴 1~11°C 微风
19日 阴转多云 2~10°C 微风
20日 晴 -1~8°C 微风
21日 晴 -3~7°C 3-4级转微风
22日 晴转多云 0~9°C 微风转3-4级
23日 多云转晴 0~11°C 微风
24日 晴 0~11°C 微风
- szl1997
- 帖子: 292
- 注册时间: 2009-11-24 14:12