这个tr命令中的点是做什么的:tr…AZ A-ZA-Z <<<“ JVPQBOV”(带有13个点)


18

我想用来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"

所以我有两个问题:

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

我知道有13个点。我想知道它是如何工作的。手册中没有关于点的解释
Frederico Oliveira

4
您最好希望您不要在输入文本中碰到一个点
iruvar

1
FWIW较短的形式tr [.*13].A-Z A-ZA-Z以及tr .............A-Z A-ZA-Z
iruvar

Answers:


17

其工作方式如下:

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

因此tr将翻译SET1SET2

这等效于第一个,因为它也以1313个点为单位移动。

要包括小写字母,您必须将它们SET1以类似的偏移量排列,即:

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

ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzabcdefghijklm

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

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

14

就像@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可能会使用set 2中的第一个匹配字符,这将产生一个A。)

要回答第二个问题,您需要在第一个集合中再加上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.

1

好的,因此感谢@Prvt_Yadv,我能够理解这些点。这是第一个问题的答案:

第二个tr命令背后的魔力是什么?

这13个点被简单地映射到第二组中的前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替代。

现在是第二个问题:

像第一个命令一样,如何使第二个命令适用于大小写?

为了使它起作用,您将期望的点数放在开头,将腐烂点和中间的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..."

3
我不确定您是如何得出结论的:“点由从a到点数的字母序列取代”;事实并非如此。不涉及任何魔术;如Prvt_Yadv所述,有两个集合tr,并且一如既往地从集合1映射到集合2,但是在这种情况下,您已将字符映射.A,和B,以及...,和M。没关系,因为您的输入不包含.,但是如果输入了,它将变成一个Mtr使用您为给定输入指定的最后一个输出)
Michael Mrozek

感谢您的澄清。我已经更新了答案来纠正我的错误:)
Frederico Oliveira

1
我很欣赏您(最初)使用科学来确定该程序的行为的尝试,但是将来您应该想出尽可能多的不同假设,并尝试使用它们之前进行设计测试以区分所有假设。否则,您最终会感到困惑,并以最小的变化方式调整模型以解释随后的结果,直到模型只是大量特殊情况为止。
wizzwizz4
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.