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

4

假设我有一个变量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个回答

7

如果是n=2,可以这样使用(我们在嵌套的扩展中使用2个问号):

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

解释

这是一个嵌套的扩展。

扩展${var%%??}被嵌入到扩展${var# }中。
${var#string}扩展将删除与'string'匹配的变量开头的任何内容。因此,在这种情况下,我们正在从与${var%%??}匹配的变量开头删除任何内容。

独立使用时,${var%%??}匹配示例中变量的“this is my v”,因为%%扩展在变量末尾匹配最长可能的匹配项。在这种情况下,是两个正则表达式?。


不理解这部分 => var#${var%??} ?? :) - NoobEditor
这是一个嵌套扩展。${var%%??} 扩展嵌入到 ${var# } 扩展中。${var#string} 扩展将删除与“string”匹配的变量开头的任何内容。因此,在这种情况下,我们正在删除与 ${var%%??} 匹配的变量开头的任何内容。单独使用,${var%%??} 与示例中的变量匹配 "this is my v",因为 %% 扩展在变量末尾匹配最长可能的匹配项。在这种情况下,是两个正则表达式?号。希望这有所帮助。 - Ell
这是获取Korn Shell脚本中最后几个字符串字符的正确示例。非常感谢 :) Ell - Shankar

2
你的切割看起来很棒,只需要获得正确的偏移量。
#!/bin/ksh
var="This is a string"
n=2
(( offset =  ${#var} - $n + 1 ))
echo ${var} | cut -c ${offset}- 

或者作为一行代码
echo ${var} | cut -c $(expr  ${#var} - $n + 1 )-

1

已经有一个被接受的答案,但这里是使用 ksh 正当化变量的一种替代方法:

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

右对齐(和左对齐)属性会在长度超过指定值时进行截断,或者在指定值过短时进行填充。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接