我如何解码一个文件,其中每个字母都被字母表中它前面 13 个字母替换?

我如何解码一个文件,其中每个字母都被字母表中它前面 13 个字母替换?

有一段文本受到 ROT13 的影响,名为rot.txt。ROT13(旋转 13 位)将字母替换为字母表中该字母后面的第 13 个字母。我该如何编写命令来查看实际文本?

我试过:

cat rot.txt | tr 'A-Za-z' 'N-ZA-Mn-za-m'

但没有成功

答案1

您还可以使用以下命令获得相同的输出:

tr '[a-z][A-Z]' '[n-za-m][N-ZA-M]'

或者

tr '[a-zA-Z]' '[n-za-mN-ZA-M]'

就我个人而言,我发现这种语法更容易理解。

答案2

以下是一个示例

echo "hello world" | tr "$(echo -n {A..Z} {a..z} | tr -d ' ')" "$(echo -n {N..Z} {A..M} {n..z} {a..m} | tr -d ' ')"

输出:

uryyb jbeyq

使其成为一个函数:

function rot13() {    
    cat | tr "$(echo -n {A..Z} {a..z} | tr -d ' ')" "$(echo -n {N..Z} {A..M} {n..z} {a..m} | tr -d ' ')" 
}

用法:

➜ echo "hello world" | rot13 
uryyb jbeyq

答案3

Rot13 是一种(非常简单的)算法,用于将每个字符移动 13 个位置。

abcdefghijklmn # notice it ends in "n"
+1234567890123 # 13 places

这就是为什么“a”变成“n”,“b”变成“o”等等。“tr”是一种“翻译”或替换字符的工具。因此,要将它们翻译成 rot13,您需要像这样将文本传递给 tr 进行翻译

echo "hello world" | tr 'A-Za-z0-9' 'N-ZA-Mn-za-m5-90-4'
# will echo "uryyb jbeyq"

注意第二组以“N”开头,因为“N”是 A+13。要“取消”rot13(这是你问的,但没人回答),你只需交换集合

echo "uryyb jbeyq" | tr 'N-ZA-Mn-za-m5-90-4' 'A-Za-z0-9' 
# will be translated back to "hello world"

“存储”此内容的一个简单方法是创建别名

alias rot13="tr 'A-Za-z0-9' 'N-ZA-Mn-za-m5-90-4'"
alias unrot13="tr 'N-ZA-Mn-za-m5-90-4' 'A-Za-z0-9'"

因此,为了最终解决您的问题,您将像这样“解密”您的文件

cat rot.txt | unrot13

答案4

Vim 具有 ROT13 功能。您可以打开文件并应用g?{motion}诸如g?GROT13 到底部或g??ROT13 到某一行。

或者您可以从命令行通过将正常模式 ( norm) 命令应用于整个文档 ( %) 来执行此操作:vi -c "%norm g??" rot.txt

相关内容