What does tr语言 - ct do?



我对tr选项的执行顺序感到困惑。

例如,有这样一个命令:

echo 123 | tr -ct 'n' '0'

这是如何执行的?是首先执行-c还是先执行-t

我也对这个命令的结果感到困惑。我想先执行-c,结果是123,然后执行-t,结果是023,最后是023n。但这是错误的,正确的答案是123n,我不知道为什么,有人能告诉我吗?

有趣的是,tr -ct似乎补充了第一个集合,然后将其截断为第二个集合的长度。这可能不是你应该依赖的行为,因为-t说它"首先将SET1截断为SET2的长度"。

无论如何,明显的效果是首先应用-c,将第一个集合n转换为包含除n之外的所有字符的集合,并按升序排序(因此第一个字符是NUL字符)。然后,应用-t,导致集合被截断为仅。因此,tr将把NUL字符翻译成0字符。

举个例子,考虑一下:

$ tr --version
tr (GNU coreutils) 8.13
$ echo -e 'XX'
XX
$ echo -e 'XX' | tr -ct 'n' '0'
X0X

-c表示使用字符串1中字符的补码,或者"任何不在字符串1中的字符都将替换字符串1的值"。

-t意味着将第一组值截断为第二组值的长度。字符串2的长度只有1个字符,因此字符串1被截断为该长度。

换句话说:tr-ct'\n'0'->tr-t'\000\001\002…01234…ABCDEF…'0'->tr'\000'0'

试试这个来测试它:

printf '00afoon' | tr -ct 'na' '7'

"任何不是'\n'或'a'的字符(-c)都变为'\000'(-t),因为为长度为1的字符串2指定了'7'。现在试试这个:

printf '00afoon' | tr -ct 'na' '[7*]'

"任何不是'\n'或'a'的字符(-c)都将保留,因为'7'用于该集中的任何字符。这是GNU和历史BSD tr的默认行为,因此如果没有指定-t,"7"one_answers"[7*]"一样有效。对于System V和POSIX tr,"[7*]"是一种重复形式,而"7"只是用"7"替换第一集中的第一个字符,这可以说更直观,当然也是问题的一部分(如果指定了-t,GNU tr会将行为更改为System V)。

最新更新