这个 tr 命令中的点有什么作用: tr ........AZ A-ZA-Z <<< "JVPQBOV" (with 13 dots)

Fre*_*ira 18 tr

我想用来tr做一些 rot13 转换。我可以很好地理解这个命令:

tr A-Za-z N-ZA-Mn-za-m <<< "URYC ZR CYRNFR"
Run Code Online (Sandbox Code Playgroud)

哪个输出是HELP ME PLEASE,但我不知道这个其他命令如何产生相同的 rot13 转换:

tr .............A-Z A-ZA-Z <<< "URYC ZR CYRNFR"
Run Code Online (Sandbox Code Playgroud)

所以我有两个问题:

  1. 第二个tr命令背后的魔法是什么?
  2. 如何使第二个命令既适用于小写又适用于大写,就像第一个命令一样?

Prv*_*dav 17

它的工作原理如下:

SET1-> .............ABCDEFGHIJKLMNOPQRSTUVWXYZ
SET2-> ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLM
Run Code Online (Sandbox Code Playgroud)

所以tr会翻译SET1成SET2.

这相当于第一个,因为它也按13单位移动,因为有 13 个点。

要包含小写字母,您必须SET1使用类似的偏移量排列它们,即:

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

ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzabcdefghijklm
Run Code Online (Sandbox Code Playgroud)

那是Z和之间的 26 个点a,跨越大写字母和小写字母的一半。所以tr命令本身将是:

tr .............A-Z..........................a-z A-ZA-Za-za-z
Run Code Online (Sandbox Code Playgroud)


use*_*803 14

正如@Prvt_Yadv 在他们的回答中所说,它有效,因为有 13 个点。

套装是

First set:  .............ABCDEFGHIJKLMNOPQRSTUVWXYZ
Second set: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
Run Code Online (Sandbox Code Playgroud)

点不是特殊字符,因此如果您的输入中有一个点,它也会被翻译。在tr我所拥有的版本中,它是第二组中最后一个对应的字符,在本例中为M:

$ echo URYC ZR CYRNFR. | tr .............A-Z A-ZA-Z
HELP ME PLEASEM
Run Code Online (Sandbox Code Playgroud)

(我可以想象不同版本的tr可能会使用第 2 组中的第一个匹配字符,这将给出A.)

要回答你的第二个问题,你需要第一组中的另外 13 个点来“用完”组 2 中剩余的大写字母:

First set:  .............ABCDEFGHIJKLMNOPQRSTUVWXYZ.............
Second set: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
Run Code Online (Sandbox Code Playgroud)

然后你可以重复这个模式:

First set:  .............ABCDEFGHIJKLMNOPQRSTUVWXYZ..........................abcdefghijklmnopqrstuvwxyz
Second set: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
Run Code Online (Sandbox Code Playgroud)

这给了我们:

tr .............A-Z..........................a-z A-ZA-Za-za-z
Run Code Online (Sandbox Code Playgroud)

所以:

$ echo Uryc zr cyrnfr | tr .............A-Z..........................a-z A-ZA-Za-za-z
Help me please
Run Code Online (Sandbox Code Playgroud)

就我个人而言,我认为在您的问题中的第一种方法更简单!

第一种方式也不会转换输入中的任何其他字符。例如,比较:

$ echo Uryc zr cyrnfr. | tr .............A-Z..........................a-z A-ZA-Za-za-z  
Help me pleasem
Run Code Online (Sandbox Code Playgroud)

和

$ echo Uryc zr cyrnfr. | tr A-Za-z N-ZA-Mn-za-m
Help me please.
Run Code Online (Sandbox Code Playgroud)