“-dc”在“cat /dev/urandom | tr -dc “01”中如何工作?

“-dc”在“cat /dev/urandom | tr -dc “01”中如何工作?

据我所知,该/dev/urandom文件是特殊文件之一,它的目的是生成随机字符。当我执行cat /dev/urandom一串奇怪的字符时,有些甚至会连续显示汉字。但是,如果我使用该tr选项将这个奇怪字符流通过管道传输到其中,-dc它会生成一个 0 和 1 的随机流,或者将任何字符放入tr -dc "setofcharacters".

我尝试阅读 tr 的手册,但在 和 下-d-c得到了我不理解或无法理解的解释,例如

   -c, -C, --complement
          use the complement of SET1

   -d, --delete
          delete characters in SET1, do not translate

有人可以善意地一步步解释背后的逻辑吗cat /dev/urandom | tr -dc "01"

答案1

我认为最大的问题是理解选项描述中“补充”的含义-c。它指的是集合论中的补集,请阅读它在维基百科上:

在集合论中,集合 A 的补集指的是不在 A 中的事物(即在 A 之外的事物)。

set 的补码01表示除 0 和 1 之外的所有字符。因此,该-d选项将删除所有既不是 0 也不是 1 的字符。

答案2

-d 表示删除 SET1 中的所有字符,-c 表示使用 SET1 的“补码”。组合起来,意思是:删除所有不在SET1中的字符

您将获得一个字符列表,包括 0 和 1,并且 tr -dc "01" 正在删除列表“01”中不存在的所有字符,仅显示 0 和 1。

答案3

补集选项只是为您提供您提供的集合的逆集合。因此,如果您给它 01,它将影响除 0 或 1 ASCII 字符之外的所有内容。删除选项将删除所选集。因此,您只需删除输入中非 0 或 1 ASCII 字符的所有内容。

请理解,虽然这些只是 /dev/urandom 输出中的 ASCII 字符,但它们并不是代表 /dev/urandom 中所有字符输出的实际二进制值。

答案4

如果你读过TR手册仔细看,你可以很容易地解释该命令。

一般形式:

tr [option]... set1 [set2]

用你的命令:

tr -dc "01"

set1包含01。使用-c选项时,tr将替换set1为其补码,这意味着除0和 之外的所有字符1

因此,该命令可以解释为删除除零和一之外的所有字符

相关内容