Я хочу использовать, tr
чтобы сделать некоторые преобразования Rot13. Я прекрасно понимаю эту команду:
tr A-Za-z N-ZA-Mn-za-m <<< "URYC ZR CYRNFR"
какой вывод HELP ME PLEASE
, но я не могу понять, как эта другая команда может произвести то же преобразование rot13:
tr .............A-Z A-ZA-Z <<< "URYC ZR CYRNFR"
Итак, у меня есть два вопроса:
- Какая магия стоит за второй
tr
командой? - Как сделать, чтобы вторая команда работала как в нижнем, так и в верхнем регистре, как и первая команда?
tr [.*13].A-Z A-ZA-Z
работает так же хорошо, какtr .............A-Z A-ZA-Z
Ответы:
Это работает следующим образом:
Так
tr
что переведемSET1
наSET2
.Это эквивалентно первому, потому что оно также сдвигается на
13
единицы, поскольку существует 13 точек.Чтобы включить строчные буквы, вам нужно расположить их
SET1
с одинаковым смещением, а именно:Это 26 точек между
Z
иa
, охватывающих половину прописного и половину строчного алфавита. Таким образом, самаtr
команда будет:источник
Как говорит @Prvt_Yadv в своем ответе, это работает, потому что есть 13 точек.
Наборы
Точка не является специальным символом, поэтому, если у вас есть точка на вводе, она также будет переведена. В той версии,
tr
которая у меня есть, это последний соответствующий символ во втором наборе, в данном случаеM
:(Я мог бы предположить, что другая версия
tr
может использовать первый соответствующий символ в наборе 2, который дастA
.)Чтобы ответить на второй вопрос , вам понадобятся еще 13 точек в первом наборе, чтобы «использовать» оставшиеся заглавные буквы в наборе 2:
тогда вы можете повторить шаблон:
что дает нам:
И так:
Лично я думаю, что первый способ сделать это в вашем вопросе проще!
Первый способ также не преобразует любые другие символы во входных данных. Например, сравните:
с
источник
Итак, благодаря @Prvt_Yadv я смог понять точки. Вот первый ответ на вопрос:
13 точек просто отображаются на первые 13 букв из второго набора. Так
tr .............A-Z A-ZA-Z
изготовит следующие комплекты:Если ваш ввод не содержит точку, вы можете отменить начальную последовательность, так как вы не будете использовать эти замены. Тогда наборы станут:
Но так как первый набор уже содержит все 26 букв, а set2 имеет повторяющиеся завершающие буквы, они также отбрасываются и, наконец, становятся
Что является заменой rot13 и идентично первой команде (за исключением случаев, когда здесь не рассматриваются строчные буквы). Та же логика может быть применена для заголовка вопроса:
tr ...A-Z A-ZA-Z <<< “JVPQBOV”
будет производить наборы:Отбрасывая начальную последовательность и завершающие повторяющиеся буквы, они становятся:
Что является заменой rot3.
Теперь по второму вопросу:
Чтобы это работало, вы помещаете желаемое количество точек в начале, сопоставляя гниль и 26 точек между верхней и нижней последовательностями, вот так:
Это успешно создаст нечувствительную гниль8. Чтобы увидеть, почему это работает, давайте посмотрим наборы:
Исключая отображение точек и конечные буквы:
Теперь это работает как в верхнем, так и в нижнем регистре :)
Другой способ заставить это работать - использовать две
tr
команды следующим образом:@Iruvar дал предупреждение об использовании подстановки точек: эта команда не будет работать должным образом, если во входной строке есть точки. Это связано с тем, что точки сопоставляются с другими буквами и при замене заменят
tr
точку ввода на последнюю сопоставленную букву. Но вы можете использовать любой другой символ, кроме точек. Таким образом, если использование точек в вашейtr
команде является проблемой, вы можете использовать@
вместо этого, например. Это будет работать так же хорошо:источник
tr
он, как всегда, отображается из набора 1 в набор 2, но в этом случае вы отобразили символ.
наA
, и такжеB
, и также ..., а такжеM
. Это не имеет значения, так как ваш ввод не содержит a.
, но если он это сделал, он превратился бы вM
(tr
использует последний выход, указанный вами для данного ввода)