bash echo问题

时间:2011-04-26 10:35:18

标签: bash sed echo

这是一个从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部分可以使用一些帮助,但这不是问题。问题是,当我运行脚本时,它应该打印找到的值两次,对吗?但它只打印一次,这是第一次(没有'价格:')。这有什么问题?

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

第一个grep读取标准输入的所有内容。然后,第二个grep阻塞尝试从stdin读取。

答案 2 :(得分:0)

我猜测与所显示的代码不同,分配实际上发生在子shell中,因此不可见(在子shell退出时丢失)

我担心你遇到了一个你不在这里展示的子shell问题。如果可以,请发布您实际使用的更多代码。

---示例:

 unset price
 price=1
 echo $price   # works

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

答案 3 :(得分:0)

关于您使用sed的几条评论:

-e 's/^ *//g' - 你不需要“g”:你的模式锚定在开头,所以它只能匹配一次。也可以查找标签:-e 's/^[[:space:]]\{1,\}//'

-e 's/<td>//g' -e 's:</td>::g'可以合并到-e 's|</\{0,1\}td>||g'