使用tr -t
命令时,string1
应该被截断为 的长度string2
,对吗?
tr -t abcdefghijklmn 123 # abc... = string1, 123 = string2
the cellar is the safest place # actual input
the 3ell1r is the s1fest pl13e # actual output
“截断”是“缩短”的另一个词,对吧?tr
根据模式进行翻译,完全忽略该-t
选项。如果我自动完成--truncate-set1
[以确保我使用正确的选项]会产生相同的输出。
问题: 我在这里做错了什么?
我在基于 Debian 的发行版上使用 BASH 工作。
更新
请注意,这是我在下面发表的评论的副本
我以为的tr -t
意思是:将 string1 缩短为 string2 的长度。我看到那个a
被翻译成1
,那个b
将被翻译成2
,那个c
被翻译成3
。这与缩短无关。 “截断”的意思似乎与我想象的不同。 [我不是母语]
答案1
当使用tr -t命令时,string1应该被截断为string2的长度,对吧?
这不是发生了什么事吗?
abcdefghijklmn
123
注意哪些字母被交换,哪些字母没有被交换:
the 3ell1r is the s1fest pl13e
'a' 和 'c',但不包括原始(未截断)集合 1 中的 e、f、i 或 l。
如果没有-t
,您将得到:
t33 33331r 3s t33 s133st p3133
这是因为(来自man tr
),“SET2 被扩展到 SET1 的长度通过重复最后一个字符有必要的。” 所以如果没有-t
截断集 1,你所拥有的与
tr abcdefhijklmn 1233333333333
让我们考虑另一个例子,但使用相同的“地窖是最安全的地方”作为输入。
> input="the cellar is the safest place"
> echo $input | tr is X
the cellar XX the XafeXt place
这是因为第二组会自动扩展以覆盖第一组的所有内容。 -t
本质上做相反的事;它截断第一组而不是扩展第二组:
> echo $input | tr -t is X
the cellar Xs the safest place
这与以下内容相同:
> echo $input | tr i X
the cellar Xs the safest place
由于 's' 从第一组中被截断。如果两组的长度相同,那么使用-t
不会有任何区别:
> echo $input | tr is XY
the cellar XY the YafeYt place
> echo $input | tr -t is XY
the cellar XY the YafeYt place