使用tr用'-'替换非字母字符会在字符串末尾添加一个额外的字符

时间:2018-08-16 12:28:10

标签: bash tr

我有以下字符串hello/world 我想将/替换为-,以获得hello-world

我尝试了以下操作:http://rextester.com/NMIOL63413

$ echo hello/world | tr -c '[:alnum:]' '-'
$ hello-world-

为什么最后会有一个额外的-以及如何摆脱呢?

1 个答案:

答案 0 :(得分:5)

很明显,echo在每个字符串的末尾打印一个\n。由于使用-c,因此您希望替换[:alnum:]部分的字符。由于换行也不是有效的字母数字字符的一部分,因此也将替换换行。

在不确定哪个“魔术”字符存在或被替换的情况下,请执行hexdump以查看字符串中的字符。您可能会在末尾看到\n

echo hello/world | hexdump -c
0000000   h   e   l   l   o   /   w   o   r   l   d  \n
000000c

因此,为避免这种换行符和其他shell元字符实例与替换字符串混淆的情况,请始终使用printf

printf '%s' 'hello/world' | tr -c '[:alnum:]' '-'