Bash中使用tr命令替换字符时为何输出右括号?
关于tr命令替换结果中右括号的来源解释
首先明确tr -c 'A-Za-z' SET2的作用:将所有非字母字符(-c表示取A-Za-z的补集)替换为SET2中的对应字符。tr的核心规则之一是:如果SET2的长度小于需要替换的字符集合(这里是补集)的长度,会重复SET2的最后一个字符,直到两者长度匹配。
看你的第二个命令:tr -c 'A-Za-z' '[ ]',这里的SET2由三个字符组成:左括号[、换行符\n、右括号]。由于非字母字符的数量远大于3,tr会重复SET2的最后一个字符]来替换所有超出SET2前3个位置的非字母字符。
你看到的输出全是],是因为原字符串中的非字母字符数量超过了SET2的长度,前几个非字母字符可能被替换成[和换行,但换行在终端中会显示为空行,容易被忽略;而后续所有非字母字符都被重复的]替换,最终呈现出全]的视觉效果。
再对比第一个命令tr -c 'A-Za-z' '[ *]',这里你使用了tr的特殊序列语法[CHAR*]:该语法会将指定的CHAR(这里是换行符\n)重复到与补集长度一致,因此所有非字母字符都被替换为换行符,这就是你看到输出中多空行的原因。
内容的提问来源于stack exchange,提问作者Echen
相关产品推荐
相关产品推荐

