![tr '[az]' '[n-za-m]' 是如何工作的?](https://linux22.com/image/17624/tr%20'%5Baz%5D'%20'%5Bn-za-m%5D'%20%E6%98%AF%E5%A6%82%E4%BD%95%E5%B7%A5%E4%BD%9C%E7%9A%84%EF%BC%9F.png)
答案1
tr
的手册页解释得很好;它是一个将字符从一组转换为另一组的过滤器。指定的第一组是[a-z]
,这是打字的简写方式[abcdefghijklmnopqrstuvwxyz]
。第二个是[n-za-m]
,变成[nopqrstuvwxyzabcdefghijklm]
。tr
从标准输入中读取每个字符,如果它出现在第一组中,它将用第二组中相同位置的字符替换它(这意味着[
和]
被替换为它们自己,所以包括它们是没有意义的,但很多人错误地这样做是因为正则表达式使用它们来表示字符类,因此他们认为tr
需要它们)。
一个更简单的例子:
$ echo abc | tr ab xy
xyc
a
变成x
、b
变成y
、 并c
保持不变,因为它不在第一组中。在这种情况下,用户所做的就是通过相同的过滤器运行他们的电子邮件地址(因为它是对称的 -a
映射到n
和n
返回到a
,等等)以获得旋转版本;你再次运行它会将所有字符交换回原来的状态
旁注:这种特殊的交换,其中每个字母都被字母表中距它 13 个字符替换,称为罗特13(旋转13);它在新闻组中很流行,作为隐藏人们可能不想看到的内容的一种方式
答案2
tr
音译字符:对于输入中的某些字符 x,它输出字符 y。
tr
采用两个命令行参数,“from”字符和“to”字符。
在上面的示例中,“来自字符”给出为'[a-z]'
。 “至字符”给出为'[n-za-m]'
。单引号阻止解释命令行的 shell 对两个参数执行任何操作。tr
将方括号内的参数视为范围。因此'[a-z]' means "all lower case characters from 'a' to 'z', inclusive". The second argument is a bit more complicated,
'[n-za-m]'` 表示“从 'n' 到 'z' 的小写字符(包括在内),以及从 'a' 到 'm' 的小写字符(包括在内)”。
tr
将所有输入的“a”字符音译为“n”,将“b”音译为“m”,将“c”音译为“o”等,最多将“n”个字符输出为“z”。输入中的“o”字符输出为“a”、“p”到“b”、“q”到“c”等。输入中的“z”字符输出为“l”。
本质上,你的命令做了一个凯撒密码在其输入上,一次一个小写字符。必须有人加密“[电子邮件受保护]" 获取您echo
输出的字符串。