2011-08-21 191 views
1

我想要一个命令/函数,最好是bash,它需要一个单词/字符串和一个数字,并将该单词中的字母位置移动该数字,将溢出旋转回开始位置。在单词中移位字母位置

例如与输入stack2输出将cksta

我曾经想过用tr,但我不能完全弄清楚如何使它普遍以便与任何文字工作,而不是仅仅从目标平移特定的字母字。

+0

有没有办法用'在一般情况下tr'做到这一点。如果你的字符串保证不包含除了要旋转的部分之外的任何地方的字符,你可以用'tr'去除它们,但这是一个相当折磨的论点。 – tripleee

回答

4

您可以使用bash的内置字符串操作:

#!/bin/bash 

string=$1 
shift=$2 

length=${#string} 
echo ${string:$length-$shift:$shift}${string:0:$length-$shift} 

例子:

$ ./script stack 1 
kstac 
$ ./script stack 2 
cksta 
$ ./script stack 3 
ackst 
$ ./script stack 4 
tacks 
+0

完美,谢谢!作为对其他读者的一个提示,您可以通过将字符串的长度添加到移位变量中来改变其他方式。 – Jordan

+0

我不明白:length = $ {#string}然后我在这里找到了一个值得阅读: 字符串长度。 http://wiki.bash-hackers.org/syntax/pe#substring_removal –

0

短一点是负值的使用,从右边数:

string=$1 
shift=$2 
length=${#string} 
echo ${string: -shift}${string:0:length-shift} 

因为: - 有自己的意思,你必须在它之前留一个空白。

2

另一种常见的方法是“双重”的字符串,从而简化了substringery:

str=stack 
len=${#str} 
n=2 
strstr=$str$str 
echo ${strstr:$len-$n:$len} # -> cksta