2011-04-26 71 views
0

这是一个bash脚本,它从html文件中提取一些数据。bash回声问题

price=`grep '  <td>\$' $1 | sed -e 's/<td>//g' -e 's:</td>::g' -e 's/\$ //g' -e 's/^ *//g'` 
grep '  <td>\$' $1 | sed -e 's/<td>//g' -e 's:</td>::g' -e 's/\$ //g' -e 's/^ *//g' 

echo "Price: $price" 

sed部分可以使用一些帮助,但这不是问题在这里。问题是,当我运行脚本时,它应该打印两次发现的值,对吧?但它只是第一次打印它(没有'Price:')。这里有什么问题?

回答

1

问题是您要返回的字符串中有一个\r,它在将内容打印出来之前将光标返回到第一列。使用od -c进行验证。并使用适当的工具(如xmlstarlet)确保不会发生这种情况。

+1

xmlstarlet这里是一个很好的建议 – sehe 2011-04-26 10:41:57

+0

'tr'ing出\ r奏效了。 – Igor 2011-04-26 10:52:21

0

第一个grep读取标准输入的所有内容。然后,第二个grep块试图从标准输入读取。

0

我猜测,不像所示的代码,分配实际上发生在子shell,因此是不可见的(输于子shell的退出)

我怕你遇到了你DONOT子shell问题在这里展示。发布更多的代码,如果可以的话,您实际上使用。

---样品:

unset price 
price=1 
echo $price # works 

unset price 
echo -n 1 | price=$(cat) 
echo $price # works _not_ 
+0

没有更多的代码,这是整个脚本(以及变量的部分)。它运行在此:http://www.apparelorder.com/Productview.Asp?ProID=528844 – Igor 2011-04-26 10:45:15

+0

好。然后几率转向Ignacio – sehe 2011-04-26 10:46:23

+0

PS提及的'\ r'假设。不需要提及你正在运行哪个_hahahaha – sehe 2011-04-26 10:46:50

0

关于您的使用sed的意见夫妇:

-e 's/^ *//g' - 你不需要的 “G”:你的模式在开始时抛锚所以它只能匹配一次。不妨看看制表符太:-e 's/^[[:space:]]\{1,\}//'

-e 's/<td>//g' -e 's:</td>::g'可以折叠成-e 's|</\{0,1\}td>||g'