请教一个sed的奇怪的问题?

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
szl1997
帖子: 292
注册时间: 2009-11-24 14:12

请教一个sed的奇怪的问题?

#1

帖子 szl1997 » 2014-12-17 22:16

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的前面加的“到”字没有了。
2014-12-17 .png
snapshot2.png
上次由 szl1997 在 2014-12-18 15:06,总共编辑 3 次。
男儿心比铁,纵死亦千钧!
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 请教一个sed的奇怪的问题?

#2

帖子 eexpress » 2014-12-18 9:51

你用sed处理中文,不考虑编码的?百度等网站的内容,缺省就不是utf8
● 鸣学
头像
astolia
论坛版主
帖子: 6703
注册时间: 2008-09-18 13:11

Re: 请教一个sed的奇怪的问题?

#3

帖子 astolia » 2014-12-18 11:02

你没有弄明白sed的x命令的意思。
x Exchange the contents of the hold and pattern spaces.
sed -i '/°C/x' ${wfile} 这样做的实际效果是把原来第N次出现°C的行与第N-1次的行交换,而非你想要的把某一天的两行数据交换。所以第一次的行会被清空,前一天的数据会跑到后一天去。

解析html,还是要用专门的工具,而不是用sed之类的纯文本处理工具
头像
szl1997
帖子: 292
注册时间: 2009-11-24 14:12

Re: 请教一个sed的奇怪的问题?

#4

帖子 szl1997 » 2014-12-18 15:09

解释一下,因为笔记本和台式机不在一起,所以截图的时间不是同一天,上图是12.04上执行的结果,下图是10.04上执行的结果。代码是完全一样的,可以发现不同的地方在上图中第一行温度没有了,第二行中“到“字没有了。(终端输出,不是原文件,但源文件也是一样的)。10.04上执行x的时候第一个匹配的行因为没有连续两行含有°C所以产生了一个空行,后面有连续两行有°C的话两行直接互换。(我也很奇怪为什么仅仅sed ‘/°C/x‘可以做到,想了半天都不行想直接x一下行不行没想到成功了)。 :em06 如果想将匹配行和下一行互换正确该怎么写?
男儿心比铁,纵死亦千钧!
头像
astolia
论坛版主
帖子: 6703
注册时间: 2008-09-18 13:11

Re: 请教一个sed的奇怪的问题?

#5

帖子 astolia » 2014-12-18 16:59

你也不仔细看一下就觉得用成功了。18日的气温是1~11,19日是2~10,你输出的是18日气温11,19日1~10。

如果你坚持非要用sed来完成的话,可以这么干

代码: 全选

sed -i -e '/°C/{n;s/°C/°C到/}' ${wfile}
sed -i '/°C/x' ${wfile}
换成

代码: 全选

sed -i '/°C/{N;s/\s*\(.*\)\n\(.*\)/\2到\1/}' ${wfile}
头像
astolia
论坛版主
帖子: 6703
注册时间: 2008-09-18 13:11

Re: 请教一个sed的奇怪的问题?

#6

帖子 astolia » 2014-12-18 17:11

我自己来做的话,如果不用高级语言,就用专门的html解析工具,代码的灵活性可读性要好得多
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

Re: 请教一个sed的奇怪的问题?

#7

帖子 szl1997 » 2014-12-18 19:33

果然是。。。 :em06 受教了,呵呵。多谢!
男儿心比铁,纵死亦千钧!
回复