如何将字符串的每个字母移动一定数量的字母?

时间:2011-06-22 14:08:11

标签: bash string

如何在不使用硬编码字典的情况下,将一个字符串的每个字母按bash向下或向上移动一定数量的字母?

5 个答案:

答案 0 :(得分:16)

你的意思是像ROT13:

pax$ echo 'hello there' | tr '[a-z]' '[n-za-m]'
uryyb gurer

pax$ echo 'hello there' | tr '[a-z]' '[n-za-m]' | tr '[a-z]' '[n-za-m]'
hello there

对于要提供任意旋转(0到26)的更通用的解决方案,您可以使用:

#!/usr/bin/bash

dual=abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
phrase='hello there'
rotat=13
newphrase=$(echo $phrase | tr "${dual:0:26}" "${dual:${rotat}:26}")
echo ${newphrase}

答案 1 :(得分:6)

$ alpha=abcdefghijklmnopqrstuvwxyz
$ rot=3
$ sed "y/${alpha}/${alpha:$rot}${alpha::$rot}/" <<< 'foobar'
irredu

答案 2 :(得分:0)

如果您还想轮换大写字母,则可以使用如下所示的内容:

cat data.txt | tr '[a-z]' '[n-za-m]' | tr '[A-Z]' '[N-ZA-M]'

data.txt具有您要旋转的任何内容。

答案 3 :(得分:0)

cat data.txt | tr 'a-zA-Z' 'n-za-mN-ZA-M' 

它也能用

答案 4 :(得分:0)

Shift by 12 characters(A becomes M, and vice versa)

Encryption
----------
$> echo ABCDE | tr '[A-Z]' '[M-ZA-L]' // prints MNOPQ

Decryption
----------
$> echo MNOPQ | tr '[M-ZA-L]' '[A-Z]' // prints ABCDE

在加密示例中,我们将 ABCDE 通过管道传递给命令 tr,该命令给出了两个参数。第一个是匹配的字符串。它将匹配您输入中的某些字符串(在我们的例子中是 ABCDE)。第二个参数作用于第一个参数的结果并相应地修改它。因此,我们基本上匹配输入 ABCDE 中存在的任何大写字母并将其传递给第二个参数。第二个参数用它们的第 12 个下一个对应物替换字符。现在,这部分很重要,可能会混淆一些人,我们基本上从第二个参数中的 [M-L] 开始。由于 tr 命令不直接接受这一点,我们将其分解为两个单独的块。第一个块是 [M-Z],第二个是 [A-L]。它基本上就像一个搜索和替换机制。你用第一个参数搜索,用第二个参数修改,就这么简单。

对于第二个示例,我刚刚将 tr 命令中的第一个参数与第二个参数交换了。它完美地充当解密器。您可以按照与第一个示例相同的方式编写它,但是当我拥有加密算法时,我发现它花费的时间更少,而且我可以将参数交换为拥有解密算法。