在ksh中获取字符串的最后n个字符

时间:2014-07-03 12:16:13

标签: linux string shell solaris ksh

假设我有一个变量name持有一些字符串值

要获取最后n个字符,请在bash中编写:

$ echo "${name: -n}"

ksh中的等效方式是什么,我看过sedawk方法,但我正在寻找的是与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上 - 如果这有帮助

3 个答案:

答案 0 :(得分:6)

你可以使用它,比如n = 2(我们将在嵌套扩展中使用2个问号):

$ var="this is my var"
$ echo "${var#${var%??}}"
ar

<强>解释

这是一个嵌套扩展。

扩展${var%%??}嵌入在展开${var# }中。${var#string}展开将从匹配'string'的变量开头切断任何内容。所以我们在这个例子中说,从匹配${var%%??}的变量的开头删除任何东西。

由于${var%%??}扩展与变量末尾的最长匹配匹配,因此%%与示例中的变量匹配“this is my v”。在这种情况下,有两个正则表达式。

答案 1 :(得分: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 )-

答案 2 :(得分:0)

已经接受了答案,但这是一种替代方法,使用ksh合理的变体的概念:

var="This is a test"
typeset -R4 foo
foo="${var}"
echo "${foo}"

如果超出长度,则右(和左)对齐属性会导致截断,如果指定的值太短,则会导致填充。