2013-11-01 49 views

回答

53

這是sed一個辦法:

$ echo $file | sed 's/[^0-9]*//g' 
123 
$ echo "123 he23llo" | sed 's/[^0-9]*//g' 
12323 

或者純bash

$ echo "${file//[!0-9]/}" 
123 
$ file="123 hello 12345 aaa" 
$ echo "${file//[!0-9]/}"  
12312345 

保存結果到變量本身,也

$ file=$(echo $file | sed 's/[^0-9]*//g') 
$ echo $file 
123 

$ file=${file//[!0-9]/} 
$ echo $file 
123 
+1

在完整性的利益,你也可以保存結果回來與相同的變量純粹的bash形式:'file = $ {file // [!0-9] /}'。另外,你可以用*命令*'<<<'* something *替換'echo * * something *'|'* command *。 –

+0

好點,@MarkReed。根據用戶的要求,我寧願讓答案非常天真,因爲對於開始使用bash腳本的人來說,<<<'可能很奇怪。我用'file = $ file {file // [!0-9] /}'更新我的答案,非常感謝! – fedorqui

+0

尋找版本字符串(例如'git version 1.7.1')?使用'$ {gitVersion // [!0-9。] /}'並保留句號。 – bbodenmiller

3

你可以說:

echo ${file%%[^0-9]*} 

然而,這種運行到在某些情況下的問題:

$ file="123 file 456" 
$ echo ${file%%[^0-9]*} 
123 

使用tr

$ file="123 hello 456" 
$ new=$(tr -dc '0-9' <<< $file) 
$ echo $new 
123456 
+0

看起來像這個答案**可怕**錯了! – devnull

+0

「某些情況下」? '$ {file %% [^ 0-9] *}'將始終刪除從第一個非數字到字符串結尾的所有內容。 '%%'不是你想要的東西(也不是'''''''''''''''''')。我覺得我在這裏錯過了一個笑話。 –

+0

親愛的@MarkReed,我認爲你所說的話已經在答案中明確表達出來了,或者不是?可能這就是提出另一種方法的原因。我在這裏錯過了什麼嗎? – devnull

相關問題