Пара возможностей bash, при условии, что вы сделали N=3
(или любое другое поле).
echo "ab12 34_56.78" | grep -Eo "[[:digit:]]+" | tail -n+$n | head -n1
echo "ab12 34_56.78" | grep -Eo "[[:digit:]]+" | tr '\n' '\t' | cut -f$N
Вы можете легко сделать это в awk, без дополнительных команд оболочки:
echo "ab12 34_56.78" | awk -vN=3 -F'[^[:digit:]]+' '{print $(N+($1==""))}'
-F
устанавливает в качестве разделителя полей регулярное выражение, которое соответствует любой последовательности не цифр; добавление ($1=="")
к N
означает, что перед первым числом нет ни одного non-di git.
Если у вас есть Gnu grep или какая-либо другая реализация grep, которая предлагает PCRE, вы может использовать \K
утверждение «сброса точки совпадения»:
echo "ab12 34_56.78" | grep -Po '(?:[[:digit:]]+[^[:digit:]]+){2}\K[[:digit:]]+'
или если вы хотите использовать $N
для управления номером совпадения:
echo "ab12 34_56.78" | grep -Po '(?:[[:digit:]]+[^[:digit:]]+){'$((N-1))'}\K[[:digit:]]+'