менять человека обозначает буквами положение с ударом

Если мне назвали файл text.txt и это содержит одну строку текста, ijbiaubiu действительно ли возможно переместить каждую букву одно пространство вперед или назад в алфавите для шифрования его вручную, с тем, чему я верю, был бы шифр ГНИЛИ?

Как это сделано?

Я попробовал sed и perl -pi -e но я не знаю, как считать содержание файла прежде, чем применить команды, и эти утилиты никогда не добивались цели.

Для разъяснения я не ищу справку, шифрующую мои файлы. Скорее со справкой, учащейся, как использовать CLI для смещения об алфавитных символах в файле вручную.

2
задан 2 December 2018 в 06:54

3 ответа

sed

может сделать это с командой преобразования y/…/…/, например, заменять “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=13 для ROT13. Это работает с отрицательными числами также. Тот же подход может использоваться для ниже 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, например, заменять “b” и т.д:

perl -npe 'tr/abcdefghijklmnopqrstuvwxyz/bcdefghijklmnopqrstuvwxyza/'

-n должен выполнить итерации по аргументам имени файла и -p распечатать строки впоследствии, то же как добавление ;print к выражению сделал бы.

Пример выполняется

$ <<<"ijbiaubiu" perl -npe 'tr/abcdefghijklmnopqrstuvwxyz/bcdefghijklmnopqrstuvwxyza/'
jkcjbvcjv
4
ответ дан 2 December 2019 в 01:25

Можно сделать это использование tr команда. Поиск "Bash шифра ГНИЛИ" приводит меня к caesar-cipher.sh.

  • Обратите внимание, что команды чувствительны к регистру.

Кодирование шифра Caesar:

$ 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

Декодирование шифра Caesar:

$ 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'
10
ответ дан 2 December 2019 в 01:25
$ cat text.txt 
ijbiaubiu

1 вращение с Python, после установки 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 таким образом после z Вы повторяетесь к a при необходимости,
  6. добавление порядкового номера нижнего регистра a назад и
  7. преобразование порядкового номера к строковому значению.

Если Вы знаете Python, могло бы быть легче читать, если это не 1 лайнер:

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]))
3
ответ дан 2 December 2019 в 01:25

Другие вопросы по тегам:

Похожие вопросы: