“tr”命令如何工作?

“tr”命令如何工作?

我正在玩弄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 耗尽。

相关内容