Что делают точки в этой команде tr: tr… AZ A-ZA-Z <<< «JVPQBOV» (с 13 точками)


18

Я хочу использовать, 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"

Итак, у меня есть два вопроса:

  1. Какая магия стоит за второй trкомандой?
  2. Как сделать, чтобы вторая команда работала как в нижнем, так и в верхнем регистре, как и первая команда?

Я знаю, что есть 13 точек. То, что я хочу знать, как это работает. Там нет объяснения о точках в руководстве
Фредерико Оливейра

4
вам лучше надеяться, что вы не
столкнетесь

1
FWIW более короткая форма tr [.*13].A-Z A-ZA-Zработает так же хорошо, какtr .............A-Z A-ZA-Z
iruvar

Ответы:


17

Это работает следующим образом:

SET1-> .............ABCDEFGHIJKLMNOPQRSTUVWXYZ
SET2-> ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLM

Так trчто переведем SET1на SET2.

Это эквивалентно первому, потому что оно также сдвигается на 13единицы, поскольку существует 13 точек.

Чтобы включить строчные буквы, вам нужно расположить их SET1с одинаковым смещением, а именно:

.............ABCDEFGHIJKLMNOPQRSTUVWXYZ..........................abcdefghijklmnopqrstuvwxyz

ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzabcdefghijklm

Это 26 точек между Zи a, охватывающих половину прописного и половину строчного алфавита. Таким образом, сама trкоманда будет:

tr .............A-Z..........................a-z A-ZA-Za-za-z

14

Как говорит @Prvt_Yadv в своем ответе, это работает, потому что есть 13 точек.

Наборы

First set:  .............ABCDEFGHIJKLMNOPQRSTUVWXYZ
Second set: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ

Точка не является специальным символом, поэтому, если у вас есть точка на вводе, она также будет переведена. В той версии, trкоторая у меня есть, это последний соответствующий символ во втором наборе, в данном случае M:

$ echo URYC ZR CYRNFR. | tr .............A-Z A-ZA-Z
HELP ME PLEASEM

(Я мог бы предположить, что другая версия trможет использовать первый соответствующий символ в наборе 2, который даст A.)

Чтобы ответить на второй вопрос , вам понадобятся еще 13 точек в первом наборе, чтобы «использовать» оставшиеся заглавные буквы в наборе 2:

First set:  .............ABCDEFGHIJKLMNOPQRSTUVWXYZ.............
Second set: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ

тогда вы можете повторить шаблон:

First set:  .............ABCDEFGHIJKLMNOPQRSTUVWXYZ..........................abcdefghijklmnopqrstuvwxyz
Second set: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz

что дает нам:

tr .............A-Z..........................a-z A-ZA-Za-za-z

И так:

$ echo Uryc zr cyrnfr | tr .............A-Z..........................a-z A-ZA-Za-za-z
Help me please

Лично я думаю, что первый способ сделать это в вашем вопросе проще!

Первый способ также не преобразует любые другие символы во входных данных. Например, сравните:

$ echo Uryc zr cyrnfr. | tr .............A-Z..........................a-z A-ZA-Za-za-z  
Help me pleasem

с

$ echo Uryc zr cyrnfr. | tr A-Za-z N-ZA-Mn-za-m
Help me please.

1

Итак, благодаря @Prvt_Yadv я смог понять точки. Вот первый ответ на вопрос:

Какая магия стоит за второй trкомандой?

13 точек просто отображаются на первые 13 букв из второго набора. Так

tr .............A-Z A-ZA-Z изготовит следующие комплекты:

SET1 -> .............ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> ABCDEFGHIJKLMNOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZ

Если ваш ввод не содержит точку, вы можете отменить начальную последовательность, так как вы не будете использовать эти замены. Тогда наборы станут:

SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> NOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZ

Но так как первый набор уже содержит все 26 букв, а set2 имеет повторяющиеся завершающие буквы, они также отбрасываются и, наконец, становятся

SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> NOPQRSTUVXWYZABCDEFGHIJKLM

Что является заменой rot13 и идентично первой команде (за исключением случаев, когда здесь не рассматриваются строчные буквы). Та же логика может быть применена для заголовка вопроса:

tr ...A-Z A-ZA-Z <<< “JVPQBOV” будет производить наборы:

SET1 -> ...ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> ABCDEFGHIJKLMNOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZ

Отбрасывая начальную последовательность и завершающие повторяющиеся буквы, они становятся:

SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> DEFGHIJKLMNOPQRSTUVXWYZABC

Что является заменой rot3.

Теперь по второму вопросу:

Как сделать, чтобы вторая команда работала как в нижнем, так и в верхнем регистре, как и первая команда?

Чтобы это работало, вы помещаете желаемое количество точек в начале, сопоставляя гниль и 26 точек между верхней и нижней последовательностями, вот так:

tr ........A-Z..........................a-z A-ZA-Za-za-z

Это успешно создаст нечувствительную гниль8. Чтобы увидеть, почему это работает, давайте посмотрим наборы:

SET1 -> ........ABCDEFGHIJKLMNOPQRSTUVXWYZ..........................abcdefghijklmnopqrstuvxwyz
SET2 -> ABCDEFGHIJKLMNOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZabcdefghijklmnopqrstuvxwyzabcdefghijklmnopqrstuvxwyz

Исключая отображение точек и конечные буквы:

SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZabcdefghijklmnopqrstuvxwyz
SET2 -> IJKLMNOPQRSTUVXWYZABCDEFGHijklmnopqrstuvxwyzabcdefgh

Теперь это работает как в верхнем, так и в нижнем регистре :)

Другой способ заставить это работать - использовать две trкоманды следующим образом:

tr .............A-Z A-ZA-Z <<< "ABJ V hqrefgnaq" | tr .............a-z a-za-z

@Iruvar дал предупреждение об использовании подстановки точек: эта команда не будет работать должным образом, если во входной строке есть точки. Это связано с тем, что точки сопоставляются с другими буквами и при замене заменят trточку ввода на последнюю сопоставленную букву. Но вы можете использовать любой другой символ, кроме точек. Таким образом, если использование точек в вашей trкоманде является проблемой, вы можете использовать @вместо этого, например. Это будет работать так же хорошо:

tr @@@@@@@@@@@@@A-Z A-ZA-Z <<< "GUNAX LBH NYY..."

3
Я не уверен, как вы пришли к выводу, что «точки заменяются последовательностью букв, начинающейся от а до количества точек»; это совсем не так. В этом нет никакой магии; как объяснил Prvt_Yadv, существует два набора, и trон, как всегда, отображается из набора 1 в набор 2, но в этом случае вы отобразили символ .на A, и также B, и также ..., а также M. Это не имеет значения, так как ваш ввод не содержит a ., но если он это сделал, он превратился бы в M( trиспользует последний выход, указанный вами для данного ввода)
Майкл Мрозек

Благодарю за разъяснение. Я обновил ответ, чтобы исправить мои ошибки :)
Фредерико Оливейра

1
Я восхищаюсь вашими (первоначальными) попытками использовать науку для определения поведения этой программы, но в будущем вам следует выдвинуть как можно больше различных гипотез и разработать тесты, чтобы различать их все, прежде чем пытаться использовать их. В противном случае вы запутаетесь и адаптируете свою модель с наименьшими изменениями, чтобы объяснить последующие результаты, пока ваша модель не станет просто массой особых случаев.
wizzwizz4
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.