2011-04-27 98 views
3

我想從給定字符串中提取第一個數字。數字是一個浮點數,但我只需要小數點前的整數。從字符串中提取第一個數字

例如:

string1="something34521.32somethingmore3241" 

輸出我要的是34521

什麼是在bash做到這一點最簡單的方法?

謝謝!

回答

1

這sed的1個班輪將做的工作,我認爲:

str="something34521.32somethingmore3241" 
echo $str | sed -r 's/^([^.]+).*$/\1/; s/^[^0-9]*([0-9]+).*$/\1/' 
輸出
34521 
+0

我喜歡你的答案的1班輪方面,但閱讀OP提供的示例數據和輸出。 int()是否將值從字符串中移除? – shellter 2011-04-28 01:07:02

+1

@shellter:當OP最初發布的問題是不同的,並提供了不同的樣本數據。現在由於問題已經更新,所以我需要提出一個替代答案。 – anubhava 2011-04-28 01:16:27

+0

壞OP,壞!不要更改數據! ;-) – shellter 2011-04-28 01:19:48

3

你說你有一個字符串,並要提取的數目,我假設你有其他的東西,以及。

$ echo $string 
test.doc_23.001 
$ [[ $string =~ [^0-9]*([0-9]+)\.[0-9]+ ]] 
$ echo "${BASH_REMATCH[1]}" 
23 

$ foo=2.3 
$ [[ $string =~ [^0-9]*([0-9]+)\.[0-9]+ ]] 
$ echo "${BASH_REMATCH[1]}" 
2 

$ string1="something34521.32somethingmore3241" 
$ [[ $string1 =~ [^0-9]*([0-9]+)\.[0-9]+ ]] 
$ echo "${BASH_REMATCH[1]}" 
34521 
1

所以只是爲了簡單起見,我會發布當我到達這裏時實際上正在尋找的東西。

echo $string1 | sed '[email protected]^[^0-9]*\([0-9]\+\).*@\[email protected]' 

簡單地跳過不管是不是從字符串^[^0-9]*開頭的數字,再搭配數\([0-9]\+\),接着是字符串.*的休息並打印匹配的數量\1

我有時喜歡用@而不是sed中的經典/替換表達式,只是爲了在所有斜槓和反斜槓中提供更好的可見性。在處理路徑時非常方便,因爲您不需要轉義斜線。在這種情況下不重要。只是在說'。