2011-04-26 48 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'