На самом деле это не мой вопрос, кто-то спрашивал об этом в группе на Facebook, но никто не смог ответить, поэтому есть некоторые переменные:
x="abcde12345"
y="s'ldfsd[opsk12345"
z="1234sdfsdfafa23456"
Он хочет отобразить числа в конце этих переменных, поэтому конечный результат должен быть таким:
12345
123456
Количество цифр может быть разным, это может быть от 1 до 10 или даже от 1 до 100000. и это не всегда 12345
, это случайно. Как лучше всего это сделать? Я пробовал, grep -P "[0-9].*[0-9]$"
но это также показывает буквы между цифрами.
решение1
В bash можно удалить самую длинную начальную подстроку, заканчивающуюся нецифрой, из переменной, $var
используяподстановка параметров ${var##[^0-9]}
или (POSIXly) ${var##[!0-9]}
например
$ echo "$x --> ${x##*[^0-9]}"
abcde12345 --> 12345
$
$ echo "$y --> ${y##*[^0-9]}"
s'ldfsd[opsk12345 --> 12345
$
$ echo "$z --> ${z##*[^0-9]}"
1234sdfsdfafa23456 --> 23456
См. напримерРасширение параметров
решение2
#!/bin/bash
x="abcde12345"
y="s'ldfsd[opsk12345"
z="1234sdfsdfafa23456"
echo $x | grep -o '[0-9]*$'
echo $y | grep -o '[0-9]*$'
echo $z | grep -o '[0-9]*$'
Выход:
12345
12345
23456
как в man grep
-o, --only-matching Print only the matched (non-empty) parts of a matching line, with each such part on a separate output line.