В зависимости от того, как это будет используемым и Ваша версия удара, Вы, вероятно, были бы более обеспеченным использованием ассоциативного массива.
Приводя это к сбою, я предлагаю, чтобы Вы фальсифицировали тот.
Ради полноты можно на самом деле сделать это использование eval
. Обратите внимание, что оценка опасна, и Вы не должны использовать это, если Вы не имеете к.
eval "${string/: /=\"}\""
echo foo bar baz | perl -pe 's/.*[ \t]//'
Если необходимо разделить конечные пробелы сначала, сделайте это как это:
echo "foo bar baz " | perl -lpe 's/\s*$//;s/.*\s//'
Следующее было внесено mr.spuratic в комментарии:
echo "foo bar baz " | perl -lane 'print $F[-1]'
echo foo bar baz | while read i; do echo ${i##* }; done
или bash
не Ваша оболочка по умолчанию:
echo foo bar baz | bash -c 'while read i; do echo ${i##* }; done'
Если необходимо разделить единственный конечный пробел сначала, сделать
echo "foo bar baz " | while read i; do i="${i% }"; echo ${i##* }; done
echo foo bar baz | tr ' ' '\n' | tail -n1
хотя это будет только работать на одну строку входа, в отличие от решений выше. Подавление конечных пробелов в этом подходе:
echo "foo bar baz " | tr ' ' '\n' | grep . | tail -n1
Использование сокращения:
Последнее поле:
echo 1 2 3 4 5 | rev | cut -f1 -d ' '
Последний знак:
echo 1 2 3 4 5 | rev | cut -c1
51
вместо 5
. Проверьте мой ответ.
– Emanuel Berg
02.04.2013, 18:20
rev
снова в конце для поворачиваний назад.
– Skippy le Grand Gourou
25.11.2014, 19:05
echo hello my friend | tac -s' ' | tr '\n' ' ' | cut -d' ' -f 1
Что-то вроде этого должно работать:
sed -E -e 's/.* ([^ ]+)$/\1/'
% echo 1 2 3 4 5 | sed -E -e 's/.* ([^ ]+)$/\1/'
5
sed -e 's/.* \([^ ]\{1,\}\)/\1/'
Извините, у меня нет машины Соляриса для фактического тестирования его.
– gelraen
02.04.2013, 12:38
perl -an
позволяет использованиеF
выстройте как awk's$1
,$2
и т.д., хотя это индексируется нулем и нет никакого специального предложенияNF
таким образом, Вы используете$F[-1]
(или немного некрасивое$F[$#F]
). – mr.spuratic 02.04.2013, 13:07