Bash:tr命令,带有表示字符的变量
我想使用tr命令将字符映射到新字符,例如:Bash:tr命令,带有表示字符的变量,bash,variables,ascii,tr,Bash,Variables,Ascii,Tr,我想使用tr命令将字符映射到新字符,例如: echo“hello”| tr'[a-z]'[b-za-b]'将输出:ifmmp (小写字母表中的每个字母向右移动一个) 请参见下面的“[b-za-b]”到新字符的映射: [a b c d e f g h i j k l m n o p q r s t u v w x y z]将映射到: [b c d e f g h i j k l m n o p q r s t u v w x y z a] 但是,当我希望它旋转多次时,如何使用变量来控制tr命令的
echo“hello”| tr'[a-z]'[b-za-b]'
将输出:ifmmp
(小写字母表中的每个字母向右移动一个)
请参见下面的“[b-za-b]”
到新字符的映射:
[a b c d e f g h i j k l m n o p q r s t u v w x y z]
将映射到:
[b c d e f g h i j k l m n o p q r s t u v w x y z a]
但是,当我希望它旋转多次时,如何使用变量来控制tr命令的旋转值 例如:对于1班:
echo“hello”| tr'[a-z]'[b-za-b]'
不带变量和:
echo“hello”| tr'[a-z]'[(a+$var)-za-(a+$var)]”
where$var=1
这里我有:(a+$var)-z
表示与b-z
相同
………a-(a+$var)
表示与a-b
我曾尝试将ascii值转换为字符以在tr命令中使用,但我认为这是不允许的
我的问题是bash没有解释:
(a+$var)
作为字符b
当$var=1时
(a+$var)
作为字符c
当$var=2时
。。。等等
如何告诉bash将这些方程解释为tr命令的字符
编辑
我尝试使用数组执行此操作,但不起作用:
字符=({a..z})
var=2
回音“hello”| tr'[a-z]'[(${chars[var]}-z)(a-${chars[var]})]”
我使用:(${chars[var]}-z)
来表示b-z
,其中var=1
因为
${chars[1]}
是b
,但这不起作用。我遗漏了什么吗?你可以使用八进制\XXX
字符代码来完成你想要的任务。使用八进制代码,您可以对数字进行任何算术运算,然后将其转换为字符代码
#rotr x
#
#如果0您试图做的事情无法使用不满足您要求的tr
来完成。此外,当您打算在bash
中修改并使用变量添加到glob模式时,这是您不可能做到的
有一个巧妙的小技巧,你可以用bash数组!。tr
命令也可以在普通glob模式上采用扩展的数组序列。首先将源数组定义为
source=()
现在,使用大括号扩展将其内容添加为a-z
的字符范围列表
source=({a..z})
现在对于音译数组,从源数组开始,使用索引打印数组元素,按照如下方式构造它
trans=()
使用语法${array[@]:(-num)}
从最后一个数组中获取数组元素的技巧将获得元素的总长度-num。因此,首先构建阵列
var=2
trans+=( "${source[@]:(-(26-$var))}" )
现在要构建数组的第二部分,请使用另一个技巧${array[@]:0:num}
获取元素的第一个num
数量
trans+=( "${source[@]:0:$(( $var + 1 ))}" )
因此,我们现在所做的是,对于给定的var=2
,我们将trans
数组构建为
echo "${trans[@]}"
c d e f g h i j k l m n o p q r s t u v w x y z a b c
现在,您可以在tr
命令中轻松地使用它
echo "hello" | tr "${source[*]}" "${trans[*]}"
jgnnq
您可以将其全部放在函数中,并将其值打印为
transChar() {
local source
local trans
local result
source=({a..z})
trans=()
var="$2"
input="$1"
trans+=( "${source[@]:(-(26-$var))}" )
trans+=( "${source[@]:0:$(( $var + 1 ))}" )
result=$( echo "$input" | tr "${source[*]}" "${trans[*]}" )
echo "$result"
}
一些测试
transChar "hello" 1
ifmmp
transChar "hello" 2
jgnnq
transChar "hello" 3
khoor
随机腐烂:
# generate alphabet as arr:
arr=( {1..26} )
i=$(($RANDOM%24+1))
# left and right
l=$(echo ${arr[$i]})
r=$(echo ${arr[$i+1]})
# reusing arr for testing:
echo ${arr[@]} | tr "a-z" "$r-za-$l"
echo "secret:" | tr "a-z" "$r-za-$l" ; echo $l $r $i
amkzmb:
h i 7
使用带有ord()
和chr()
函数、Python、Perl、C等的语言…请参阅:
transChar "hello" 1
ifmmp
transChar "hello" 2
jgnnq
transChar "hello" 3
khoor
# generate alphabet as arr:
arr=( {1..26} )
i=$(($RANDOM%24+1))
# left and right
l=$(echo ${arr[$i]})
r=$(echo ${arr[$i+1]})
# reusing arr for testing:
echo ${arr[@]} | tr "a-z" "$r-za-$l"
echo "secret:" | tr "a-z" "$r-za-$l" ; echo $l $r $i
amkzmb:
h i 7