Що роблять точки в цій команді 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 крапок. Я хочу знати, як це працює. Пояснення щодо крапок у посібнику немає
Frederico Oliveira

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. Це не має значення, оскільки ваш внесок не містить а ., але якщо він зробив, він перетвориться на M( trвикористовує останній результат, який ви вказали для даного вводу)
Michael Mrozek

Дякуємо за роз’яснення. Я оновив відповідь, щоб виправити свої помилки :)
Фредеріко Олівейра

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