Если мы сосредоточимся на концепции:
«Набор из (одной или нескольких) цифр»
Мы могли бы использовать несколько внешних инструментов для извлечения чисел.
Мы могли бы довольно легко стереть все остальные символы, или 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 для больших файлов.