tr 명령의 점은 무엇을 합니까? tr .........AZ A-ZA-Z <<< "JVPQBOV" (13개의 점이 있습니다)

tr 명령의 점은 무엇을 합니까? tr .........AZ A-ZA-Z <<< "JVPQBOV" (13개의 점이 있습니다)

trrot13 변환을 수행하고 싶습니다 . 나는 이 명령을 잘 이해할 수 있습니다.

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. 첫 번째 명령과 마찬가지로 두 번째 명령도 소문자와 대문자 모두에서 작동하도록 하려면 어떻게 해야 합니까?

답변1

작동 방식은 다음과 같습니다.

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

따라서 로 tr번역될 것입니다 .SET1SET2

13이것도 13개의 점이 있으므로 단위로 움직인다는 점에서 첫 번째와 동일합니다 .

SET1소문자를 포함하려면 비슷한 오프셋으로 정렬 해야 합니다 . 예:

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

ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzabcdefghijklm

Za와 사이에는 대문자의 절반과 소문자의 절반에 걸쳐 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..."

관련 정보