Как разбить строку в оболочке и получить последнее поле - PullRequest
265 голосов
/ 02 июля 2010

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

Ответы [ 17 ]

2 голосов
/ 02 июля 2010

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

$ var1="1:2:3:4:0"
$ IFS=":"
$ set -- $var1
$ eval echo  \$${#}
0
1 голос
/ 01 января 2019

Может быть немного поздно с ответом, хотя простое решение - изменить порядок ввода строки. Это позволит вам всегда получать последний предмет независимо от его длины.

[chris@desktop bin]$ echo 1:2:3:4:5 | rev | cut -d: -f1
5

Важно отметить, что, если при использовании этого метода числа превышают 1 цифру (или больше, чем один символ в любых обстоятельствах), вам потребуется выполнить еще одну команду 'rev' для конвейерного вывода.

[chris@desktop bin]$ echo 1:2:3:4:5:8:24 | rev | cut -d: -f1
42
[chris@desktop bin]$ echo 1:2:3:4:5:8:24 | rev | cut -d: -f1 | rev
24

Надеюсь, я смогу помочь, ура

1 голос
/ 19 февраля 2018

Для тех, кому не без Python, https://github.com/Russell91/pythonpy - хороший выбор для решения этой проблемы.

$ echo "a:b:c:d:e" | py -x 'x.split(":")[-1]'

Из справки по pythonpy: -x treat each row of stdin as x.

С помощью этого инструмента легко написать код Python, который будет применен ко входу.

1 голос
/ 24 ноября 2017

Решение, использующее встроенное чтение:

IFS=':' read -a fields <<< "1:2:3:4:5"
echo "${fields[4]}"

Или, чтобы сделать его более универсальным:

echo "${fields[-1]}" # prints the last item
1 голос
/ 22 июня 2012
for x in `echo $str | tr ";" "\n"`; do echo $x; done
0 голосов
/ 29 января 2019

Соответствие регулярному выражению в sed является жадным (всегда идет к последнему вхождению), которое вы можете использовать в своих интересах здесь:

$ foo=1:2:3:4:5
$ echo ${foo} | sed "s/.*://"
5
0 голосов
/ 05 января 2019

Если вам нравится python и у вас есть возможность установить пакет, вы можете использовать эту утилиту python .

# install pythonp
pythonp -m pip install pythonp

echo "1:2:3:4:5" | pythonp "l.split(':')[-1]"
5
...