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