このtrコマンドのドットは何をしますか:tr…AZ A-ZA-Z <<<“ JVPQBOV”(13ドットあり)


18

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"

そこで、2つの質問があります。

  1. 2番目のtrコマンドの背後にある魔法は何ですか?
  2. 最初のコマンドと同様に、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翻訳するSET1SET2

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

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

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

ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzabcdefghijklm

はとの間の26ドットでZa大文字のアルファベットの半分と小文字のアルファベットの半分にまたがっています。したがって、trコマンド自体は次のようになります。

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

14

@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番目の質問答えるには、セット2の残りの大文字を「使い切る」ために、最初のセットにさらに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.

1

それでは、@ 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

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

動作させるもう1つの方法はtr、次の2つのコマンドを使用することです。

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
「ドットは、aからドットの数までの一連の文字に置き換えられる」とどのように結論付けたのかわかりません。そうではありません。関連する魔法はありません。Prvt_Yadvが説明したように、2つのセットがあり、いつものようにtrセット1からセット2にマッピングしていますが、この場合は、キャラクター.を、、AまたB、また...、そしてにマッピングしていますM。入力にはが含まれていないため、これは問題ではありませんが、含まれている.場合はMtr指定された入力に対して指定した最後の出力を使用します)
Michael Mrozek

説明をありがとう。間違いを修正するために答えを更新しました:)
オリベイラ

1
私はあなたの(最初の)科学を使ってこのプログラムの振る舞いを決定しようとしますが、将来的にはできるだけ多くの異なる仮説を考え出し、それらを使用するにそれらすべてを区別するテストを設計する必要があります。そうしないと、混乱してしまい、変更が最も少ない方法でモデルを調整して、モデルが単なる特殊なケースになるまで後続の結果を説明することになります。
wizzwizz4
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.