Предположим, что у меня есть строка 1:2:3:4:5
и я хочу получить его последнее поле (5
в этом случае). Как я делаю тот Bash использования? Я попробовал cut
, но я не знаю, как указать последнее поле с -f
.
Вы можете использовать строковые операторы:
$ foo=1:2:3:4:5
$ echo ${foo##*:}
5
Это обрезает все спереди до ':', жадно.
${foo <-- from variable foo
## <-- greedy front trim
* <-- matches anything
: <-- until the last ':'
}
Предполагая довольно простое использование (например, без экранирования разделителя), вы можете использовать grep:
$ echo "1:2:3:4:5" | grep -oE "[^:]+$"
5
Breakdown - найти все символы, а не разделитель ([^:]) в конце строки ($) . -o печатает только соответствующую часть.
Трудно получить последнее поле с помощью cut, но вот (один набор) решений на awk и perl
$ echo 1:2:3:4:5 | awk -F: '{print $NF}' 5 $ echo 1:2:3:4:5 | perl -F: -wane 'print $F[-1]' 5
Использование Bash.
$ var1="1:2:3:4:0"
$ IFS=":"
$ set -- $var1
$ eval echo \$${#}
0
Один способ:
var1="1:2:3:4:5"
var2=${var1##*:}
Другой, с использованием массива:
var1="1:2:3:4:5"
saveIFS=$IFS
IFS=":"
var2=($var1)
IFS=$saveIFS
var2=${var2[@]: -1}
Еще один с массивом:
var1="1:2:3:4:5"
saveIFS=$IFS
IFS=":"
var2=($var1)
IFS=$saveIFS
count=${#var2[@]}
var2=${var2[$count-1]}
Использование регулярных выражений Bash (версия> = 3.2):
var1="1:2:3:4:5"
[[ $var1 =~ :([^:]*)$ ]]
var2=${BASH_REMATCH[1]}