2013-11-01 16 views

Antwort

53

Dies ist ein Weg mit sed:

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

Oder mit reinem bash:

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

Um das Ergebnis in die Variable zu speichern selbst, nicht

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

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

Im Interesse der Vollständigkeit, können Sie auch mit der das Ergebnis wieder in den gleichen Variablen speichern reine Bash-Form: 'file = $ {file // [! 0-9] /}'. Außerdem können Sie im Allgemeinen 'echo' * etwas * '|' * Befehl * mit * Befehl * '<<<' * etwas * ersetzen. –

+0

Guter Punkt, @MarkReed. Je nach der Art des Benutzers fragte ich mich, ob ich die Antwort sehr naiv hinterlassen sollte, da '' '' für Leute, die mit bash-skript anfangen, seltsam sein kann. Ich aktualisiere meine Antwort mit der 'file = $ file {file // [! 0-9] /}', vielen Dank! – fedorqui

+0

Suchen Sie dies für eine Versionszeichenfolge (z. B. Git Version 1.7.1)? Verwende '$ {gitVersion // [! 0-9.] /}' Und es behält die Perioden bei. – bbodenmiller

3

Man kann sagen, :

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

jedoch läuft diese Probleme in bestimmten Fällen:

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

Mit tr:

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

Sieht so aus, als ob etwas furchtbar falsch mit dieser Antwort ist! – devnull

+0

"bestimmte Fälle"? '$ {file %% [^ 0-9] *}' wird immer alles von der ersten Nicht-Ziffer bis zum Ende der Zeichenkette entfernen. '%%' ist hier überhaupt nicht erwünscht (auch nicht'% 'oder' # 'oder' ## '). Ich habe das Gefühl, dass mir hier ein Witz fehlt. –

+0

Sehr geehrte @MarkReed, ich dachte, dass das, was Sie sagen, in der Antwort selbst klargestellt wurde, oder nicht? Wahrscheinlich war das der Grund, dass ein anderer Ansatz vorgeschlagen wurde. Fehle ich hier etwas? – devnull

Verwandte Themen