有一段文本受到 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?G
ROT13 到底部或g??
ROT13 到某一行。
或者您可以从命令行通过将正常模式 ( norm
) 命令应用于整个文档 ( %
) 来执行此操作:vi -c "%norm g??" rot.txt