#linux #string #shell #solaris #ksh
#linux #строка #оболочка #solaris #ksh
Вопрос:
Допустим, у меня есть переменная name
, содержащая некоторое строковое значение
Чтобы извлечь последние n символов, в bash мы пишем :
$ echo "${name: -n}"
какой эквивалентный способ в ksh
я видел sed
и awk
методах, но то, что я ищу, — это однострочное или конвейерное решение, подобное bash
для извлечения последних символов
Пока это ошибки и попытки :
AB12 $ name="123456"
AB12 $ echo ${name:(-3)}
ksh: ${name:(-3)}: bad substitution
AB12 $ echo${name:0:-3}
ksh: echo${name:0:-3}: bad substitution
AB12 $ print ${name%?}
12345
AB12 $ echo "some string" | tail -c -1
tail: cannot open input
AB12 $ echo -n "my string discard"| tail -c -1
tail: cannot open input
AB12 $ echo "foo"| cut -c 1-2
fo
AB12 $ echo "foo"| cut -c -2
fo
AB12 $ echo $name
123456
AB12 $ echo "${name: -3}"
ksh: "${name: -3}": bad substitution
В настоящее время я работаю на Solaris — если это поможет!
Ответ №1:
Вы можете использовать это, скажем, n = 2 (мы будем использовать 2 вопросительных знака во вложенном расширении):
$ var="this is my var"
$ echo "${var#${var%??}}"
ar
Объяснение
Это вложенное расширение.
Расширение ${var%%??}
встроено в расширение ${var# }
.
${var#string}
Расширение отсечет все, начиная с начала переменной, которая соответствует ‘string’. Итак, в данном случае мы говорим об удалении из начала переменной всего, что соответствует ${var%%??}
.
Само по себе ${var%%??}
соответствует «this is my v» для переменной в примере, поскольку %%
расширение соответствует максимально возможному совпадению в конце переменной. В данном случае два регулярных выражения ?.
Комментарии:
1. вы поняли эту часть =>
var#${var%??}
?? 🙂2. Это вложенное расширение. Расширение ${var%%??} встроено в расширение ${var# }. Расширение ${var#string} отсечет все, начиная с начала переменной, которая соответствует ‘string’. Итак, в данном случае мы говорим об удалении из начала переменной всего, что соответствует ${var%%??}. Сам по себе, ${var%%??} соответствует «this is my v» для переменной в примере, поскольку расширение %% соответствует максимально возможному совпадению в конце переменной. В данном случае два регулярных выражения ?. Надеюсь, это поможет.
3. Это правильный пример получения нескольких последних символов строки для скрипта оболочки Korn. Большое спасибо 🙂 Ell
Ответ №2:
Ваш разрез выглядит хорошо, просто получите правильное смещение.
#!/bin/ksh
var="This is a string"
n=2
(( offset = ${#var} - $n 1 ))
echo ${var} | cut -c ${offset}-
или в качестве oneliner
echo ${var} | cut -c $(expr ${#var} - $n 1 )-
Ответ №3:
Уже есть принятый ответ, но вот альтернативный метод, использующий ksh
понятие обоснованных переменных:
var="This is a test"
typeset -R4 foo
foo="${var}"
echo "${foo}"
Атрибуты выравнивания справа (и слева) приводят к усечению, если длина превышена, или заполнению, если присвоенное значение слишком короткое.