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
? - 첫 번째 명령과 마찬가지로 두 번째 명령도 소문자와 대문자 모두에서 작동하도록 하려면 어떻게 해야 합니까?
답변1
작동 방식은 다음과 같습니다.
SET1-> .............ABCDEFGHIJKLMNOPQRSTUVWXYZ
SET2-> ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLM
따라서 로 tr
번역될 것입니다 .SET1
SET2
13
이것도 13개의 점이 있으므로 단위로 움직인다는 점에서 첫 번째와 동일합니다 .
SET1
소문자를 포함하려면 비슷한 오프셋으로 정렬 해야 합니다 . 예:
.............ABCDEFGHIJKLMNOPQRSTUVWXYZ..........................abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzabcdefghijklm
Z
a
와 사이에는 대문자의 절반과 소문자의 절반에 걸쳐 26개의 점이 있습니다 . 따라서 tr
명령 자체는 다음과 같습니다.
tr .............A-Z..........................a-z A-ZA-Za-za-z
답변2
@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.
답변3
@Prvt_Yadv 덕분에 이러한 점을 이해할 수 있습니다. 첫 번째 질문에 대한 답변은 다음과 같습니다.
두 번째 명령 뒤에 숨겨진 마법은 무엇입니까
tr
?
이 13개 점은 단순히 두 번째 세트의 처음 13개 문자에 매핑됩니다. 그래서
tr .............A-Z A-ZA-Z
다음 컬렉션을 생성합니다.
SET1 -> .............ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> ABCDEFGHIJKLMNOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZ
입력에 포인트가 포함되어 있지 않으면 이러한 대체 항목을 사용하지 않으므로 초기 시퀀스를 삭제할 수 있습니다. 그러면 이러한 세트는 다음과 같습니다.
SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> NOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZ
그러나 첫 번째 세트에는 이미 26개의 문자가 모두 포함되어 있고 두 번째 세트에는 뒤따르는 문자가 반복되어 있으므로 이들 역시 폐기되어 다음과 같이 끝납니다.
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
그러면 둔감한 rot8이 성공적으로 생성됩니다. 이것이 작동하는 이유를 직관적으로 이해하기 위해 다음 컬렉션을 살펴보겠습니다.
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..."