如果我有一个名为text.txt
的文件,其中包含一行文本,那么ijbiaubiu
是否可以将每个字母向前移动或移回字母表中的一个空格,以便手动加密它,并使用我认为是一个腐烂的密码?
怎么做的?
我尝试过sed
和perl -pi -e
,但是我不知道如何在应用命令之前读取文件的内容,而这些实用程序从来没有做到这一点。
为了澄清,我不需要帮助加密我的文件。相反,通过帮助学习如何使用CLI手动转换文件中的字母字符。
发布于 2018-12-01 21:53:43
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
设置为所需的旋转,例如用于ROT13的r=13
。它也适用于负数。同样的方法也可以用于下面的perl
版本。
要从文件中读取,我建议重定向(这就是为什么),例如,参见下面的示例。但是,您也可以将该文件作为参数提供给sed,例如sed '…' text.txt。
示例运行
$ <<<"ijbiaubiu" sed 'y/abcdefghijklmnopqrstuvwxyz/bcdefghijklmnopqrstuvwxyza/'
jkcjbvcjv
$ <<<"ijbiaubiu" sed 'y/abcdefghijklmnopqrstuvwxyz/zabcdefghijklmnopqrstuvwxy/'
hiahztaht
$ echo "ijbiaubiu" >rot_file
$
perl
有一个易于使用的音译工具tr,例如将“a”替换为“b”等等:
perl -npe 'tr/abcdefghijklmnopqrstuvwxyz/bcdefghijklmnopqrstuvwxyza/'
-n是对文件名参数进行迭代,-p在之后迭代以打印行,就像将;print添加到表达式中一样。
示例运行
$ <<<"ijbiaubiu" perl -npe 'tr/abcdefghijklmnopqrstuvwxyz/bcdefghijklmnopqrstuvwxyza/'
jkcjbvcjv
发布于 2018-12-01 21:43:25
您可以使用tr
命令来完成它。搜索“腐烂的密码巴什”让我找到了caesar-cipher.sh。
凯撒密码编码:
$ 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'
发布于 2018-12-02 02:09:13
$ cat text.txt
ijbiaubiu
在设置ROT = 1
之后,使用Python进行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
它所做的是:
a
的序数,从0到25得到一个数字,% 26
,所以在z
之后,如果有必要的话,你可以转到a
,a
的序号值添加回和如果您知道Python,如果它不是1-liner,它可能更容易读懂:
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]))
https://askubuntu.com/questions/1097761
复制相似问题