为什么 tr "\oo" " " 不能替换“\”字符?

为什么 tr "\oo" " " 不能替换“\”字符?

我运行了echo "\oo" | tr "\oo" " ",输出是:

\

\o不是一个特殊字符,例如\n,那么为什么\也不会转换成空格?

答案1

\o不是一个特殊字符,例如\n,那么为什么\也不会转换成空格?

因为 shell 和 GNU tr 似乎以不同的方式处理未知的反斜杠序列。

当 shell 看到 时"\oo",它会保留反斜杠 (我认为这是必需的标准行为)。但是当trconsequently\oo作为其第一个参数时,它会将 解释\oo。Busyboxtr对此的处理方式不同,它仅打印空格echo "\oo" | busybox tr "\oo" " "

结论是,不要依赖未定义的反斜杠序列,但是当需要按字面意思理解时,要转义反斜杠。

例如,改用echo '\oo' | tr '\\o' ' '。 (单引号保护反斜杠不受 shell 的干扰,第二个反斜杠将另一个反斜杠转义tr。)

答案2

这个问题本质上是“如何转义‘\’字符?”

答案:与转义所有其他字符的方法相同。

$ echo "\oo" | tr "\oo" " "
\ 

$ echo "\oo" | tr "\\oo" " "
\ 
 
$ echo "\oo" | tr "\\\oo" " "
 (blank output)

相关内容