Как разделить строку в оболочке и получить последнее поле

Предположим, что у меня есть строка 1:2:3:4:5 и я хочу получить его последнее поле (5 в этом случае). Как я делаю тот Bash использования? Я попробовал cut, но я не знаю, как указать последнее поле с -f.

278
задан JonyD 2 November 2017 в 04:17
поделиться

5 ответов

Вы можете использовать строковые операторы:

$ foo=1:2:3:4:5
$ echo ${foo##*:}
5

Это обрезает все спереди до ':', жадно.

${foo  <-- from variable foo
  ##   <-- greedy front trim
  *    <-- matches anything
  :    <-- until the last ':'
 }
396
ответ дан 23 November 2019 в 02:02
поделиться

Предполагая довольно простое использование (например, без экранирования разделителя), вы можете использовать grep:

$ echo "1:2:3:4:5" | grep -oE "[^:]+$"
5

Breakdown - найти все символы, а не разделитель ([^:]) в конце строки ($) . -o печатает только соответствующую часть.

28
ответ дан 23 November 2019 в 02:02
поделиться

Трудно получить последнее поле с помощью 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
70
ответ дан 23 November 2019 в 02:02
поделиться

Использование Bash.

$ var1="1:2:3:4:0"
$ IFS=":"
$ set -- $var1
$ eval echo  \$${#}
0
2
ответ дан 23 November 2019 в 02:02
поделиться

Один способ:

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]}
18
ответ дан 23 November 2019 в 02:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: