2014-07-03 74 views
3

讓說,我有一個變量name拿着一些字符串值擷取在KSH字符串的最後n個字符

爲了獲取最後的n個字符,在bash我們寫:

$ echo "${name: -n}" 

什麼是等價的方式ksh,我已經看到sedawk方法,但我所尋找的是一條線或管道解決方案類似bash提取最後一個字符

這些都是錯誤和EFF沃茨至今:

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上目前 - 如果這有助於

回答

6

你可以使用這個,說N = 2(我們將使用嵌套擴展2問號):

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

說明

這是一個嵌套的擴張。

擴展${var%%??}被嵌入在擴展${var# }中。
${var#string}擴展將切斷與「字符串」匹配的變量的開始處的任何內容。所以我們在這個例子中說,從與${var%%??}匹配的變量的開始處移除任何東西。

${var%%??}本身與示例中的變量「this is my v」匹配,因爲%%擴展匹配變量末尾的最長可能匹配。在這種情況下,兩個正則表達式?

+0

dint瞭解此部分=>'var#$ {var%??}'?? :) – NoobEditor

+0

這是一個嵌套擴展。擴展$ {var %% ??}嵌入在擴展$ {var#}中。 $ {var#string}擴展將切斷與匹配'string'的變量的開始處的任何內容。所以我們在這個例子中說,從與變量$ {var %% ??}匹配的變量的開頭刪除任何東西。就其本身而言,$ {var %% ??}匹配示例中變量的「this is my v」,因爲%%擴展匹配變量末尾最長的匹配。在這種情況下,兩個正則表達式?希望有所幫助。 – Ell

+0

這是獲取Korn Shell腳本的最後幾個字符串字符的正確示例。非常感謝:)埃爾 – Shankar

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)- 
0

有已經是一個公認的答案,但在這裏是一種替代方法,使用ksh概念正當viariables的:

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

右(左)如果超過長度,則調整屬性會導致截斷,如果分配的值太短,則導致填充。

相關問題