web-dev-qa-db-ja.com

このtrコマンドのドットは何をするか:tr ............. A-Z A-ZA-Z <<< "JVPQBOV"(13ドット)

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"

だから私は2つの質問があります:

  1. 2番目のtrコマンドの背後にある魔法は何ですか?
  2. 最初のコマンドと同様に、2番目のコマンドを小文字と大文字の両方で機能させるにはどうすればよいですか?
18

次のように機能します。

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

したがって、trSET1SET2に変換します。

13個のドットがあるため、13単位もシフトしているため、これは最初のものと同等です。

小文字を含めるには、それらをSET1に同様のオフセットで配置する必要があります。つまり、

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

ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzabcdefghijklm

これは、Zaの間の26ドットで、大文字の半分と小文字の半分の範囲です。したがって、trコマンド自体は次のようになります。

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

@Prvt_Yadvが答えで述べているように、13個のドットがあるので機能します。

セットは

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

ドットは特殊文字ではないため、入力にドットがある場合は、それも変換されます。私が持っているtrのバージョンでは、2番目のセットの最後の対応する文字、この場合はMです。

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

trの別のバージョンがセット2で最初に一致する文字を使用してAを与えると想像できます。)

2番目の質問に答えるため、最初のセットに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.
14
user7761803

はい、@ Prvt_Yadvのおかげで、ドットを理解できました。これが最初の質問の答えです:

2番目のtrコマンドの背後にある魔法は何ですか?

13のドットは、2番目のセットの最初の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置換です。

次に2番目の質問です。

最初のコマンドと同様に、2番目のコマンドを小文字と大文字の両方で機能させるにはどうすればよいですか?

これを機能させるには、最初に必要な数のドットを配置し、次のように、腐敗と26ドットを上位シーケンスと下位シーケンスの間で一致させます。

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

これにより、無感覚なrot8が作成されます。これが機能する理由を視覚化するために、セットを見てみましょう:

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

ドットマッピングと末尾の文字を除く:

SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZabcdefghijklmnopqrstuvxwyz
SET2 -> IJKLMNOPQRSTUVXWYZABCDEFGHijklmnopqrstuvxwyzabcdefgh

今では大文字と小文字の両方で機能します:)

これを機能させる別の方法は、次のように2つの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..."
1