Wenn wir uns auf das Konzept der:
"Eine Reihe von (einer oder mehreren) Ziffern"
Wir können verschiedene externe Tools verwenden, um die Zahlen zu extrahieren.
Wir könnten ganz einfach alle anderen Zeichen löschen, entweder sed oder tr:
name='someletters_12345_moreleters.ext'
echo $name | sed 's/[^0-9]*//g' # 12345
echo $name | tr -c -d 0-9 # 12345
Wenn $name jedoch mehrere Zahlenreihen enthält, schlägt das obige Verfahren fehl:
Wenn "name=someletters_12345_moreleters_323_end.ext", dann:
echo $name | sed 's/[^0-9]*//g' # 12345323
echo $name | tr -c -d 0-9 # 12345323
Wir müssen reguläre Ausdrücke (regex) verwenden.
Um nur den ersten Lauf (12345 nicht 323) in sed und perl auszuwählen:
echo $name | sed 's/[^0-9]*\([0-9]\{1,\}\).*$/\1/'
perl -e 'my $name='$name';my ($num)=$name=~/(\d+)/;print "$num\n";'
Aber wir könnten es auch direkt tun in der Bash (1) :
regex=[^0-9]*([0-9]{1,}).*$; \
[[ $name =~ $regex ]] && echo ${BASH_REMATCH[1]}
Dies ermöglicht es uns, den ERSTEN Lauf von Ziffern beliebiger Länge zu extrahieren
umgeben von einem beliebigen anderen Text/Zeichen.
Nota : regex=[^0-9]*([0-9]{5,5}).*$;
entspricht nur genau 5-stelligen Läufen :-)
(1) : schneller als der Aufruf eines externen Tools für jeden kurzen Text. Nicht schneller als die gesamte Verarbeitung in sed oder awk für große Dateien.