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

Конечно, давайте посмотрим, из скольких направлений мы можем взглянуть на этого слона? вещь.

Фактический системный вызов в вашей собранной программе - это машинная инструкция, которая запускает повышение привилегий в режиме ядра, а в самом ядре - это код, который вызывает инструкция. Код libc (и среда исполнения каждого языка) устанавливает машинные регистры и параметры в памяти там, где код ядра ожидает их найти, которые могут быть явно странными из-за ограничений на эту машинную инструкцию.

Попав в код самой ОС, происходит немного зеркального разворачивания машинно-зависимых вещей, которые выполняла среда выполнения, а затем совершенно обычный вызов подпрограммы.
Если вы хотите точно увидеть, как это работает в полнофункциональной ОС, загрузите исходный код ядра ( git clone https://git.kernel.org/cgit/linux/kernel/ git / torvalds / linux.git / ) и сделайте, например, git grep -i system \ call . Вытащите исходный код glibc и сделайте то же самое.

18
06.04.2019, 06:22
2 ответа

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

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
17
27.01.2020, 19:46

Как говорит @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 точек в первом наборе, чтобы «израсходовать» оставшиеся прописные буквы во втором наборе:

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.
14
27.01.2020, 19:46

Теги

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