好的,因此感谢@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..."