在终端中,如果我将变量char定义为:
export char=\'\\\"\?\!实际上,char是字符串。
'\"?!然后使用tr命令将'\"?!替换为数字01234
tr "\'\\\"\?\!" "01234"我想我会得到
01234相反,我得到了
0\123如果有人能向我解释发生了什么,我会非常感激的。
用sed命令单独替换每个字符似乎避免了这个问题,但为什么呢?
发布于 2020-02-09 08:31:21
不仅仅是shell,而且tr本身也将反斜杠解释为一个特殊的转义字符,有关详细信息,请参阅其手册。因此,当您要替换反斜杠时,您需要确保tr收到文字\\ (两个反斜杠)。这可能是由char=...\\\\...在shell中完成的,这部分不需要进一步解释,因为您正确地理解了shell如何处理反斜杠。
在这里,这可能不方便,但在许多其他情况下很方便,并且允许字符集或NUL字节作为搜索或替换集的一部分(否则就不可能了)。例如,要将以NUL分隔的字符串转换为以换行符分隔的字符串,您可以执行类似于tr '\0' '\n' < /proc/1234/environ的操作,或者使用tr '[:upper:]' '[:lower:]'来小写字符串。如果tr没有转义字符,这是不可能的。
https://unix.stackexchange.com/questions/566550
复制相似问题