Выборка последних n символов строки в ksh

#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}"
  

Атрибуты выравнивания справа (и слева) приводят к усечению, если длина превышена, или заполнению, если присвоенное значение слишком короткое.