如何在不使用硬编码字典的情况下,将一个字符串的每个字母按bash向下或向上移动一定数量的字母?
答案 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
命令中的第一个参数与第二个参数交换了。它完美地充当解密器。您可以按照与第一个示例相同的方式编写它,但是当我拥有加密算法时,我发现它花费的时间更少,而且我可以将参数交换为拥有解密算法。