Это дополнительный вопрос к этому вопросу о том, как найти последнюю сгруппированную цифру в строке в bash.

4 решения отлично сработали для исходного вопроса, но я понимаю, что решение будет более адаптируемым, если будет добавлена поддержка десятичных дробей.

Итак, если у меня есть

string="123 abc 456.1"

Я бы получил

456.1

И если бы я имел

string="123 abc 456.1."

Я бы еще получил

456.1

И если бы я имел

string="123 abc 456."

Я бы просто получил

456

Дополнительно,

string="1.2 1.3"

Просто вернется

1.3
-1
Xi Ling 21 Авг 2018 в 00:33

3 ответа

Лучший ответ

Попробуйте это с помощью GNU с помощью и использованием для here-string <<<:

string="123 abc 456.1"
bc -l <<< "$(echo "$string" | grep -oP '.*?\K\d+\.\d*')*1" | awk 'END{print}'

(работает во всех случаях)

1
Gilles Quenot 20 Авг 2018 в 22:21

Использование awk:

$ string="123 abc 456.1"
$ awk '{print $NF+0}' <<< $string
456.1
$ string="123 abc 456."
$ awk '{print $NF+0}' <<< $string
456
$ string="1.2 1.3"
$ awk '{print $NF+0}' <<< $string
1.3

$NF+0 говорит awk взять последний элемент и добавить 0 в десятичном контексте.
Если последний элемент не является числом, возвращаемое значение будет 0.

0
oliv 21 Авг 2018 в 06:11

Вы можете адаптировать связанное решение, чтобы получить десятичное число следующим образом:

# utility function
lastNum() {
    grep -Eo '[[:digit:]]+(\.[[:digit:]]+)?' <<< "$1" | tail -1
}

# Call it as

lastNum '1.2 1.3'
1.3

lastNum '123 abc 456.1.'
456.1

lastNum "123 abc 456."
456

lastNum "123 abc 456.1"
456.1
2
anubhava 20 Авг 2018 в 22:10
51938793