Предположим, у меня есть строка, 1:2:3:4:5
и я хочу получить ее последнее поле ( 5
в данном случае). Как мне это сделать с помощью Bash? Я пытался cut
, но я не знаю, как указать последнее поле с -f
.
293
Вы можете использовать строковые операторы :
$ foo=1:2:3:4:5
$ echo ${foo##*:}
5
Это урезает все от фронта до «:», жадно.
${foo <-- from variable foo
## <-- greedy front trim
* <-- matches anything
: <-- until the last ':'
}
5
если строка1:2:3:4:5:
(при использовании строковых операторов выдает пустой результат). Это особенно удобно при разборе путей, которые могут содержать (или не содержать) завершающий/
символ.${foo%:*}
.#
- с начала;%
- с конца.#
,%
- кратчайший матч;##
,%%
- самый длинный матч.echo ${pwd##*/}
не работает.pwd
как переменную. Попробуйdir=$(pwd); echo ${dir##*/}
. Работает для меня!Другой способ - повернуть до и после
cut
:Это позволяет легко получить последнее, кроме одного поля, или любой диапазон полей, пронумерованных с конца.
источник
echo "1 2 3 4" | rev | cut -d " " -f1 | rev
rev
, что мне было нужно!cut -b20- | rev | cut -b10- | rev
Трудно получить последнее поле, используя cut, но вот некоторые решения в awk и perl
источник
/
символ:/a/b/c/d
и/a/b/c/d/
дают тот же результат (d
) при обработкеpwd | awk -F/ '{print $NF}'
. Принятый ответ приводит к пустому результату в случае/a/b/c/d/
/
качестве разделителя, и если ваш путь будет,/my/path/dir/
он будет использовать значение после последнего разделителя, который является просто пустой строкой. Поэтому лучше избегать косой черты, если вам нужно сделать такую вещь, как я.awk '{$NF=""; print $0}' FS=: OFS=:
часто работает достаточно хорошо.Предполагая довольно простое использование (без экранирования, например), вы можете использовать grep:
Разбивка - найти все символы, не разделители ([^:]) в конце строки ($). -o печатает только соответствующую часть.
источник
В одну сторону:
Другой, используя массив:
Еще один с массивом:
Использование регулярных выражений Bash (версия> = 3.2):
источник
Просто переведите разделитель на новую строку и выберите последнюю запись с помощью
tail -1
.источник
\n
, но в большинстве случаев это наиболее читаемое решение.Использование
sed
:источник
Если ваше последнее поле состоит из одного символа, вы можете сделать это:
Проверьте манипуляции со строками в bash .
источник
a
, а не последнего поля .Здесь есть много хороших ответов, но все же я хочу поделиться этим, используя базовое имя :
Однако он потерпит неудачу, если в вашей строке уже есть «/» . Если косая черта / является вашим разделителем, то вам просто нужно (и нужно) использовать базовое имя.
Это не лучший ответ, но он просто показывает, как вы можете быть креативными, используя команды bash.
источник
Используя Bash.
источник
echo ${!#}
вместоeval echo \$${#}
.Сначала используйте xargs, разделите его, используя «:», - n1 означает, что каждая строка имеет только одну часть. Затем выводит последнюю часть.
источник
источник
Для тех, кто знаком с Python, https://github.com/Russell91/pythonpy - хороший выбор для решения этой проблемы.
С помощью pythonpy:
-x treat each row of stdin as x
.С помощью этого инструмента легко написать код Python, который будет применен к вводу.
источник
Может быть, немного поздно с ответом, хотя простое решение состоит в том, чтобы изменить порядок ввода строки. Это позволит вам всегда получать последний предмет независимо от его длины.
Важно отметить, однако, что при использовании этого метода и числах больше, чем 1 цифра (или больше, чем один символ в любых обстоятельствах), вам нужно будет выполнить еще одну команду 'rev' для конвейерного вывода.
Надеюсь, я могу помочь, ура
источник
Решение с использованием встроенного чтения:
Или, чтобы сделать его более общим:
источник
Если вам нравится python и у вас есть возможность установить пакет, вы можете использовать эту утилиту python .
источник
echo "1:2:3:4:5" | python -c "import sys; print(list(sys.stdin)[0].split(':')[-1])"
pythonp
пакета - заставить вас делать то же самое, что иpython -c
при меньшем наборе символов. Пожалуйста, посмотрите на README в репозитории.Соответствие регулярному выражению в
sed
является жадным (всегда идет к последнему вхождению), которое вы можете использовать в своих интересах здесь:источник