Если мы сосредоточимся на концепции:
«Набор из (одной или нескольких) цифр»
Мы могли бы использовать несколько внешних инструментов для извлечения чисел.
Мы могли бы легко стереть все остальные символы, как sed, так и tr:
name='someletters_12345_moreleters.ext'
echo $name | sed 's/[^0-9]*//g' # 12345
echo $name | tr -c -d 0-9 # 12345
Но если $ name содержит несколько серий чисел, вышеприведенный сбой:
Если «name = someletters_12345_moreleters_323_end.ext», то:
echo $name | sed 's/[^0-9]*//g' # 12345323
echo $name | tr -c -d 0-9 # 12345323
Нам нужно использовать регулярные выражения (регулярное выражение).
Чтобы выбрать только первый запуск (12345, а не 323) в sed и perl:
echo $name | sed 's/[^0-9]*\([0-9]\{1,\}\).*$/\1/'
perl -e 'my $name='$name';my ($num)=$name=~/(\d+)/;print "$num\n";'
Но мы могли бы также сделать это напрямую в bash (1) :
regex=[^0-9]*([0-9]{1,}).*$; \
[[ $name =~ $regex ]] && echo ${BASH_REMATCH[1]}
Это позволяет нам извлечь ПЕРВЫЙ набор цифр любой длины
в окружении любого другого текста / символов.
Примечание : regex=[^0-9]*([0-9]{5,5}).*$;
будет соответствовать только точно 5 разрядам. : -)
(1) : быстрее, чем вызывать внешний инструмент для каждого короткого текста. Не быстрее, чем вся обработка внутри sed или awk для больших файлов.