我正在玩弄tr
并得到了一些意想不到的结果。在这些情况下发生了什么?我不明白幕后发生了什么,或者也许我没有正确使用这个命令。
实施例A
echo '0123456789' | tr [:digit:] '12'
1222222222
示例B1
echo '1111111111' | tr [:digit:] '12'
2222222222
示例B2
echo '1111111111' | tr '1' '12'
1111111111
示例C1
按预期工作。
echo '0123456789' | tr '5' 'x'
01234x6789
示例C2
我预计这01234xx6789
可能会产生,或者它以某种方式解释了所有这些示例 - 因为只有原始字符可以被替换(无法添加其他字符)。
echo '0123456789' | tr '5' 'xx'
01234x6789
答案1
tr
的参数是地图字符数:字符按照 1:1 的顺序映射。在替换集中,最后一个字符根据需要重复;多余的字符将被忽略。
因此
tr 5 x
正如预期的那样,将“5”替换为“x”。
tr 5 xx
也将“5”替换为“x”;多余的“x”将被忽略。
tr 1 12
将“1”“替换”为“1”;多余的“2”将被忽略。
tr '[:digit:]' '12'
引用以避免 shell 扩展,相当于(取决于语言环境)
tr 0123456789 122222222
并将“0”替换为“1”,并将“1”至“9”替换为“2”。
答案2
IMO 这种行为在macos tr 手册页:
在第一种概要形式中,string1 中的字符被转换为 string2 中的字符,其中 string1 中的第一个字符被转换为 string2 中的第一个字符,依此类推。如果 string1 比 string2 长,则重复在 string2 中找到的最后一个字符,直到 string1 耗尽。