使用 bash 改变单个字母的位置

使用 bash 改变单个字母的位置

如果我有一个名为的文件text.txt ,其中包含一行文本,ijbiaubiu 是否可以将每个字母在字母表中向前或向后移动一个空格,以便手动加密它,我相信这将是一个 ROT 密码?

如何完成?

我已经尝试过sedperl -pi -e但我不知道如何在应用命令之前读取文件的内容,而这些实用程序从来没有起到作用。

需要澄清的是,我并不是在寻求有关加密文件的帮助。而是在寻求有关如何使用 CLI 手动转换文件中字母字符的帮助。

答案1

你可以使用tr命令来执行此操作。搜索“ROT cypher Bash”会引导我找到凯撒密码

  • 请注意,命令区分大小写。

凯撒密码编码:

$ echo "THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG" | tr '[A-Z]' '[X-ZA-W]'
QEB NRFZH YOLTK CLU GRJMP LSBO QEB IXWV ALD

凯撒密码解码:

$ echo "QEB NRFZH YOLTK CLU GRJMP LSBO QEB IXWV ALD" | tr '[X-ZA-W]' '[A-Z]'
THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG

也可以将其调整为 ROT13:

$ echo "THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG" | tr '[A-Z]' '[N-ZA-M]'
GUR DHVPX OEBJA SBK WHZCF BIRE GUR YNML QBT

$ echo "GUR DHVPX OEBJA SBK WHZCF BIRE GUR YNML QBT" | tr '[N-ZA-M]' '[A-Z]'
THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG

对于你来说,情况是这样的:

tr '[A-Z]' '[X-ZA-W]' < file

更多来自另一个来源解码(反转要编码的模式的顺序):

ROT-3 = tr 'd-za-cD-ZA-C' 'a-zA-Z'
ROT-4 = tr 'e-za-dE-ZA-D' 'a-zA-Z'
ROT-5 = tr 'f-za-eF-ZA-E' 'a-zA-Z'
ROT-6 = tr 'g-za-fG-ZA-F' 'a-zA-Z'
ROT-7 = tr 'h-za-gH-ZA-G' 'a-zA-Z'
ROT-8 = tr 'i-za-hI-ZA-H' 'a-zA-Z'
ROT-9 = tr 'j-za-iJ-ZA-I' 'a-zA-Z'
ROT-10 = tr 'k-za-jK-ZA-J' 'a-zA-Z'
ROT-11 = tr 'l-za-kL-ZA-K' 'a-zA-Z'
ROT-12 = tr 'm-za-lM-ZA-L' 'a-zA-Z'
ROT-13 = tr 'n-za-mN-ZA-M' 'a-zA-Z'
ROT-14 = tr 'o-za-nO-ZA-N' 'a-zA-Z'
ROT-15 = tr 'p-za-oP-ZA-O' 'a-zA-Z'
ROT-16 = tr 'q-za-pQ-ZA-P' 'a-zA-Z'
ROT-17 = tr 'r-za-qR-ZA-Q' 'a-zA-Z'
ROT-18 = tr 's-za-rS-ZA-R' 'a-zA-Z'
ROT-19 = tr 't-za-sT-ZA-S' 'a-zA-Z'
ROT-20 = tr 'u-za-tU-ZA-T' 'a-zA-Z'
ROT-21 = tr 'v-za-uV-ZA-U' 'a-zA-Z'
ROT-22 = tr 'w-za-vW-ZA-V' 'a-zA-Z'
ROT-23 = tr 'x-za-wX-ZA-W' 'a-zA-Z'
ROT-24 = tr 'y-za-xY-ZA-X' 'a-zA-Z'
ROT-25 = tr 'z-za-yZ-ZA-Y' 'a-zA-Z'

答案2

sed

可以这样做变换命令y/…/…/例如将“a”替换为“b”等等:

sed 'y/abcdefghijklmnopqrstuvwxyz/bcdefghijklmnopqrstuvwxyza/'

或大写:

sed 'y/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/bcdefghijklmnopqrstuvwxyzaBCDEFGHIJKLMNOPQRSTUVWXYZA/'

为了简化这一点,你可以使用bash参数扩展,确切地说子串扩展

a=abcdefghijklmnopqrstuvwxyz
b=ABCDEFGHIJKLMNOPQRSTUVWXYZ
r=1
sed "y/$a$b/${a:$r}${a::$r}${b:$r}${b::$r}/"

要改变旋转,只需设置r为所需的旋转,例如r=13ROT13。它也适用于负数。以下perl版本可以使用相同的方法。

要读取文件,我建议重定向(原因如下),例如<text.txt sed …,请参见下面的示例。但是,您也可以将文件作为参数传递给sed,例如sed '…' text.txt

示例运行

$ <<<"ijbiaubiu" sed 'y/abcdefghijklmnopqrstuvwxyz/bcdefghijklmnopqrstuvwxyza/'
jkcjbvcjv
$ <<<"ijbiaubiu" sed 'y/abcdefghijklmnopqrstuvwxyz/zabcdefghijklmnopqrstuvwxy/'
hiahztaht
$ echo "ijbiaubiu" >rot_file
$ <rot_file sed 'y/abcdefghijklmnopqrstuvwxyz/bcdefghijklmnopqrstuvwxyza/'
jkcjbvcjv

perl

有一个易于使用的音译工具,称为tr,例如将“a”替换为“b”等等:

perl -npe 'tr/abcdefghijklmnopqrstuvwxyz/bcdefghijklmnopqrstuvwxyza/'

-n是迭代文件名参数并-p随后打印行,与添加;print到表达式中相同。

示例运行

$ <<<"ijbiaubiu" perl -npe 'tr/abcdefghijklmnopqrstuvwxyz/bcdefghijklmnopqrstuvwxyza/'
jkcjbvcjv

答案3

$ cat text.txt 
ijbiaubiu

使用 Python 进行 1 次旋转,设置后ROT = 1

$ python -c "with open('text.txt') as f: ROT = 1; print(''.join([chr((ord(char)- ord('a') + ROT)%26+ord('a')) for char in f.read().strip()]))"
jkcjbvcjv

或者设置ROT = -1

$ python -c "with open('text.txt') as f: ROT = -1; print(''.join([chr((ord(char)- ord('a') + ROT)%26+ord('a')) for char in f.read().strip()]))"
hiahztaht

它正在做的事情是:

  1. 从文件中读取字母,
  2. 获取它们的整数(或订单最终)值,
  3. 减去小写的序数值a得到 0 - 25 之间的数字,
  4. 添加旋转值,
  5. 必要% 26时,za
  6. 添加小写字母的序数值a
  7. 将序数值转换为字符串值。

如果你了解 Python,那么如果它不是一行代码的话可能会更容易阅读:

ROT = 1

def rotate_char(char, rotate_amount):
    return chr((ord(char) - ord('a') + rotate_amount)%26 + ord('a'))

with open('text.txt') as f:
    line = f.read().strip()
    print(''.join([rotate_char(char, ROT) for char in line]))

相关内容