2013-11-01 13 views

risposta

53

Questo è un modo con sed:

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

O con puro bash:

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

Per salvare il risultato nella variabile in sé, non

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

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

Per motivi di completezza, è anche possibile salvare il risultato di nuovo nella stessa variabile con il forma bash pura: 'file = $ {file // [! 0-9] /}'. Inoltre, in generale è possibile sostituire 'echo' * qualcosa * '|' * comando * con * comando * '<<<' * qualcosa *. –

+0

Buon punto, @MarkReed. Come per il tipo di utente che chiedevo, preferivo lasciare la risposta molto ingenua, dato che '<<<' può essere strano per chi inizia a bash-script. Aggiorna la mia risposta con 'file = $ file {file // [! 0-9] /}', molte grazie! – fedorqui

+0

Cercando di farlo per una stringa di versione (ad esempio 'git versione 1.7.1')? Usa '$ {gitVersion // [! 0-9.] /}' E mantiene i punti. – bbodenmiller

3

Si può dire :

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

Tuttavia, questo si imbatte in problemi in certi casi:

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

Utilizzando tr:

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

Sembra che qualcosa sia ** terribilmente ** sbagliato in questa risposta! – devnull

+0

"alcuni casi"? '$ {file %% [^ 0-9] *}' rimuoverà sempre tutto dalla prima cifra alla fine della stringa. '%%' non è quello che vuoi qui (nè '%' o '#' o '##'). Mi sento come se mi mancasse uno scherzo qui. –

+0

Caro @MarkReed, ho pensato che quello che stai dicendo è stato chiarito nella risposta stessa o no? Probabilmente è stato questo il motivo per cui è stato suggerito un altro approccio. Mi sto perdendo qualcosa qui? – devnull

Problemi correlati